coredata 谓词可以查询 3 级对象吗

Posted

技术标签:

【中文标题】coredata 谓词可以查询 3 级对象吗【英文标题】:Can coredata predicates query 3rd level objects 【发布时间】:2011-05-05 00:39:54 【问题描述】:

我正在尝试做一些更复杂的 coredata 查询,但收效甚微。

到目前为止,我已经成功地完成了这项工作:

events.@count != 0

但后来我试过这个(为了测试家属是否存在)

events.event.dependents.@count !=0
events.dependents.@count !=0

出现“不支持的函数表达式计数:(events.event.dependents)”错误。

我最理想的做法是:

ANY events.event.dependents.dependent.dependentId == 13500
ANY events.dependents.dependentId == 13500

我希望我拥有 SQL 的力量(我更熟悉):(

谢谢

【问题讨论】:

【参考方案1】:

集合运算符不能将一对多关系横向传递给键路径中的另一个键。在这种情况下,events 按照惯例将是一个 to_many 关系,所以我认为集合运算符对此感到窒息。

对于精通 SQL 但对 Core Data 不熟悉的人来说,您犯了一个非常常见的错误。您试图将 Core Data 视为只是一个 SQL 包装器,并试图将其硬塞进一个 SQL 设计模式。不要那样做。

你的问题是你正在倒退。因为 Core Data 是一个对象图,所以最常见的模式是执行获取以查找具有您要测试的属性的特定对象,并遍历这些对象的关系以查找相关对象。

因此,在这种情况下,您应该对具有dependentID 属性的实体执行提取。这将返回一个或多个对象(在这种情况下可能是一个)。然后要找到相关的对象,您将从现在的方式向后遍历键路径。所以:

dependent.dependents.event.events

如果不知道您的数据模型是什么样子,很难更具描述性,但您明白了。

在 SQL 中,尽管它是一个关系系统,但与它们在 Core Data 中的使用相比,关系相对较弱。在 SQL 中,您在 fetch 代码中生成关系。在 Core Data 中,它们在创建对象时被编码到对象图中。这意味着您在查找持久数据时要做的工作要少得多。一次提取只是从一块巨大的织物上拔出一根(或少量)线,让你通过拉扯关系来解开整个事物。

【讨论】:

以上是关于coredata 谓词可以查询 3 级对象吗的主要内容,如果未能解决你的问题,请参考以下文章

CoreData 的谓词查询

当某些字段可以为 NULL 时,我可以使用对象作为 JPA 中条件查询的谓词吗?

核心数据:基于谓词的验证

带有函数参数的 CoreData 谓词

核心数据:谓词中的对象

核心数据 - 多对象谓词