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

时间:2011-05-05 00:39:55

标签: objective-c ios4 core-data nspredicate

我正在尝试做一些更复杂的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 个答案:

答案 0 :(得分:1)

集合运算符不能将与keypath中的另一个键的多对多关系横向化。在这种情况下,events按惯例会是一个to_many关系,所以我假设集合运算符对此有窒息。

对于那些熟练掌握SQL技术但对核心数据不熟悉的人来说,这是一个很常见的错误。您试图将Core Data视为一个SQL包装器并尝试将其作为一种SQL设计模式。不要那样做。

这里的问题是你正在向后解决问题。由于Core Data是一个对象图,因此最常见的模式是执行获取以查找具有您要测试的属性的特定对象,并遍历这些对象的关系以查找相关对象。

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

dependent.dependents.event.events

如果不知道您的数据模型是什么样的,那么很难更具描述性,但您会明白这一点。

在SQL中,尽管它是一个关系系统,但与在Core Data中的使用相比,关系相对较弱。在SQL中,您在获取代码中生成关系。在Core Data中,它们在创建对象时被编码到对象图中。这意味着您必须做更少的工作才能找到持久数据。一个fetch只是从一个巨大的结构中提取一个(或少量)线程,让你通过拉动关系来解开整个事物。