如何使用NSPredicate过滤核心数据关系?

时间:2010-09-09 05:38:40

标签: core-data nspredicate iphone

假设我有“obj”类型的核心数据对象,它具有属性“propertyA”和与“sub”类型的对象的一对多关系,该对象具有两个属性“propertyB”和“propertyC”。

我想获取propertyA等于值的所有obj和带有propertyB和propertyC set的子obj。

如果只是propertyA和propertyB,我会做

[NSPredicate predicateWithFormat:@"ANY sub.propertyB = %@ AND propertyA == %@", ...];

问题是我无法弄清楚如何添加第二个属性。我只想要至少有一个具有两个属性为true的子的obj。我尝试了以下内容,但它不起作用:

[NSPredicate predicateWithFormat:@"ANY (sub.propertyB = %@ AND sub.propertyC) AND propertyA == %@", ...];

我已经尝试过没有ANY,但这也不起作用。我怎么能这样做?

2 个答案:

答案 0 :(得分:7)

由于您与子对象具有多对多关系,因此subs的{​​{1}}属性将返回一个集合而不是单个对象。要查询集合,您需要使用SUBQUERY。

子查询的格式为:

obj

在这种情况下,你会想要像

这样的东西
SUBQUERY(collection, $individualCollectionItem, expression-with-collection-item)

答案 1 :(得分:4)

解决方案似乎是:

[NSPredicate predicateWithFormat:@"propertyA == %@ AND (SUBQUERY(sub, $s, $s.propertyB == %@ AND $s.propertyC == %@).@count != 0)",  propertyAvalue, propertyBvalue, propertyCvalue];

其中末尾的值是您希望各种属性等于的值。