所以,你有一个数组或一组“帐户,你有‘用户’,这有一个一对多的关系‘帐户’,你想高效地获取到一组”用户有任何提名的账户?
的键 - 值编码的解决办法是这样的:
NSSet *setOfAccounts = ...whatever...;
// assuming the to-one relationship from 'account' to 'user' is named 'user'
NSSet *setOfUsers = [setOfAccounts valueForKey:@"user"];
你也可以使用一个核心数据的查询,如果它是更容易为你提供的某个地方,虽然我无法想出一个解决方案,不涉及一个子查询:
// assuming the to-many relationship from 'user' to 'account' is named 'accounts'
[NSPredicate predicateWithFormat:
@"SUBQUERY(accounts, $x, %@ contains $x)[email protected] > 0", accounts]
那会很可能与键 - 值编码方法要慢。如果性能问题,我建议您使用KVC方法获得一组用户,然后在self in ...
上执行取回请求,以便在所有相关用户中发生故障。
于子问题是NSPredicate
有contains
但没有对“包含在”,所以你不能直接甩掉它周围是这样的:
"any accounts isContainedIn %@", accounts
,否则将有可能向下编译到更高效的SQL。如果你的原始谓词是可适应的,那么将它作为任何操作来配制它肯定会更有效率,例如,如果它是:
/* accounts where ... */
"accountDate > %@", someDateInThePast
然后为用户提供最快的查询将是:
"any accounts.accountDate > %@", someDateInThePast
可悲的是,我不认为“任何”有一次,所以如果应用到多个领域条件的任何适当的语法您对账户的查询不是微不足道的,那么如果键值编码不可接受的话,您需要回到SUBQUERY方法。