核心数据谓词ANY + AND与多对多关系

时间:2013-06-10 14:53:22

标签: ios core-data nspredicate

我在我的模型中定义了这些实体:

[Sample]
- results (to many relation with [Result])

[Parameter]
- results (to many relation with [Result])
- compliant (number value)

[Result]
- parameter (relation with [Parameter])
- sample (relation with [Sample])

对于[Sample]对象“MySample”,我需要获取所有[Parameter]对象:

[Result].compliant = 1 AND [Result].sample = MySample

所以,我正在尝试使用谓词来获取[Parameter]对象,谓词将是这些谓词的总和:

// returns all parameters that have a result compliant value equal to 1:
ANY results.compliant = 1

// returns all parameters related with my [Sample] object:
ANY results.sample = MySample

两个谓词都按预期工作,但我想一起使用它,因为我需要获得与我的[Sample]对象相关的所有参数,其结果兼容值等于1.

我尝试过类似的东西:

ANY (results.compliant = 1 AND results.sample = MySample)

但它给了我“无效谓词”例外。

我也试过使用SUBQUERY,但它给了我这些例外:

Can't have a non-relationship collection element in a subquery

我想注意,那个查询:

ANY results.compliant = 1 AND ANY results.sample = MySample

是一个有效的查询,但不是我正在寻找的。

如何使用单个谓词解决此问题,该谓词为我提供了所有[Parameter]对象,其[Result]对象与我的[Sample]对象相关并且符合值等于1?

更新

使用NSCompoundPredicate不给我预期的结果。我需要这样的东西:

ANY (results.compliant = 1 AND results.sample = MySample)

并使用复合谓词的工作原理如下:

(ANY results.compliant = 1) AND (ANY results.sample = MySample)

复合谓词为我提供了具有等于1的结果的参数和具有与MySample连接的结果的参数,但我需要的是获得具有与MySample连接的结果的参数并且具有等于的值1(必须为单个[Result]对象编译两个条件)。任何想法如何实现?

更新2:

看来我使用了错误的SUBQUERY,解决方法是使用它应该使用:-)使用SUBQUERY我可以得到正确的结果。

2 个答案:

答案 0 :(得分:6)

我在手机上输入此内容,因此可能存在语法错误,但这是您需要子查询的地方:

[NSPredicate predicateWithFormat:@"SUBQUERY(results, $r, $r.compliant = 1 AND $r.sample = %@).@count > 0", mySample]

答案 1 :(得分:1)

我建议使用NSCompoundPredicate。

创建谓词并将它们添加到数组中,然后将它们指定为NSCompoundPredicate。

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];