CoreData NSPredicate具有两个一对多关系

时间:2013-02-07 23:47:11

标签: ios core-data many-to-many nspredicate any

我有一个像这样的CoreData模型数据结构,用于根据用户所属的组限制信息:

类别< - >>信息< - >>基团。

我有一组UserGroups对象的NSSet。我希望能够根据NSSet of Group对象过滤类别,这样如果一个类别不包含我的NSSet中包含任何组的任何信息片段,我的谓词就不会返回它们。

我可以做的信息

[NSPredicate predicateWithFormat:@"ANY groups in (%@)",groups];

对于类别我只尝试过以下情况:

[NSPredicate predicateWithFormat:@"ANY information.groups in (%@)",groups];

但我需要在类别级别编写谓词。我编程的假设是我的数据集中的信息足够大,我无法将它们全部拉出来并处理它们以查找我的类别。我想创建谓词,该谓词将仅根据他/她的组获取与用户相关的类别。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

以下关于类别的谓词应该有效(假设information是从类别信息的多对多关系:

[NSPredicate predicateWithFormat:@"SUBQUERY(information, $i, ANY $i.groups in %@).@count > 0",groups];

或者,您可以使用反向关系:

 // your set of Group objects:
 NSSet *groups = ...;
 // all Information objects that are related to any group object:
 NSSet *information = [groups valueForKey:@"information"] ;
 // all Category objects that are related to any information object:
 NSSet *categories = [information valueForKey:@"category"];

可以合并到

 NSSet *categories = [groups valueForKeyPath:@"information.category"];

这种替代解决方案的缺点可能是它还在内存中创建了一组中间组。