CoreData 谓词 ANY + AND 与多对多关系

Posted

技术标签:

【中文标题】CoreData 谓词 ANY + AND 与多对多关系【英文标题】:CoreData predicate ANY + AND with to-many relationship 【发布时间】:2013-06-10 14:53:21 【问题描述】:

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

[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

是一个有效的查询,但不是我要找的。​​p>

如何使用单个谓词解决此问题,该谓词为我提供所有 [Parameter] 对象,这些对象具有与我的 [Sample] 对象连接的 [Result] 对象并具有等于 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 我可以获得正确的结果。

【问题讨论】:

为什么不使用复合谓词? 【参考方案1】:

我是在手机上输入的,所以可能有语法错误,但这是你需要子查询的地方:

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

【讨论】:

你在计数中忘记了@,并写了@% 而不是%@,所以这应该是:[NSPredicate predicateWithFormat:@"SUBQUERY(results, $r, $r.compliant = 1 AND $r.sample = %@).@count > 0", mySample] 但这就是我要找的!以前我以错误的方式使用了 SUBQUERY,所以它会抛出异常,但你的解决方案是完美的。 @Darrarski:谢谢,我已经修好了。【参考方案2】:

我建议使用 NSCompoundPredicate。

创建你的谓词并将它们添加到一个数组中,然后像这样将它们分配为一个 NSCompoundPredicate。

NSPredicate *predicate = [NSCompoundPredicate orPredicateWithSubpredicates:subPredicates];

【讨论】:

不幸的是,这不是我想要的。我将编辑问题以更好地解释问题。

以上是关于CoreData 谓词 ANY + AND 与多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

Swift coreData - 格式化日期并在谓词中使用它

核心数据:有序关系中第一个元素的谓词

Coredata / SWIFT 获取有关系的记录

JPA CriteriaQuery 多对多谓词

具有多对多谓词的核心数据

在具有多对一/一对多关系的核心数据中构造谓词