因此,您有一个数组或一组“帐户”,您有一个与“帐户”有一对多关系的“用户”,并且您希望有效地访问具有任何指定帐户的“用户”集?
键值编码解决方案类似于:
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).@count > 0", accounts]
这可能比键值编码方法慢。如果性能是一个问题,我建议您使用 KVC 方法获取一组用户,然后self in ...
在所有相关用户中执行获取请求以排除故障。
子查询的问题是“包含在”NSPredicate
中contains
但没有任何内容,因此您不能直接将其翻转为:
"any accounts isContainedIn %@", accounts
否则可能会编译为更高效的 SQL。如果您的原始谓词是可适应的,那么将其表述为任何操作肯定会更有效,例如,如果它是:
/* accounts where ... */
"accountDate > %@", someDateInThePast
那么用户的最快查询将是:
"any accounts.accountDate > %@", someDateInThePast
可悲的是,我认为“任何”没有任何合适的语法可以一次将条件应用于多个字段,因此如果您对帐户的查询不重要,那么如果键值编码不是,则您需要使用 SUBQUERY 方法t 可以接受。