如何为对象计数多个关系创建谓词?核心数据 iOS Swift

Posted

技术标签:

【中文标题】如何为对象计数多个关系创建谓词?核心数据 iOS Swift【英文标题】:HowTo create predicate for object count several relationships deep? Core Data iOS Swift 【发布时间】:2014-09-11 18:29:16 【问题描述】:

我有一个相当棘手的问题,我还没有找到答案,希望您能提供帮助!我的情况是这样的:我在 Core Data 中有以下对象模型

场景>人物>线条

实体之间的关系:Scenes->toCharacters->Characters->toLines->Lines

我想要完成的是获取所有存在实际有线条的角色的场景。

我读过的每篇文章都只是简单地谈论“Walking The Graph”,这确实有效,但并不是一直到 Lines 实体。

例如,这个谓词工作得很好,深入一层并检索所有包含字符的场景:

    let scene_ent:NSEntityDescription = NSEntityDescription.entityForName("Scenes", inManagedObjectContext: context)

    scenerequest.entity = scene_ent

    let predicate:NSPredicate = NSPredicate(format: "toCharacters.@count > 0")        
    scenerequest.predicate = predicate

当我尝试修改谓词以检索所有包含有线条的字符的场景时:

    let predicate:NSPredicate = NSPredicate(format: "toCharacters.Characters.toLines.@count > 0")   

我收到错误“不支持的函数表达式计数:(toCharacters.Characters.toLines)”

我在这里遗漏了什么非常简单的东西吗?

谢谢!

【问题讨论】:

我认为您正在寻找的内容可以通过 SUBQUERY 实现。如果您在 SO 上进行一些搜索,您应该会找到详细信息。 【参考方案1】:

谓词中的关键路径只使用关系,而不是实体名称,所以

NSPredicate(format: "toCharacters.Characters.toLines.@count > 0")

应该是

NSPredicate(format: "toCharacters.toLines.@count > 0")

但这也可能行不通。这可能有效(目前无法测试):

NSPredicate(format: "ANY toCharacters.toLines.@count > 0")

我很确定这会奏效:

NSPredicate(format: "SUBQUERY(toCharacters, $c, $c.toLines.@count > 0).@count > 0")

更新:正确的解决办法是

NSPredicate(format: "SUBQUERY(toCharacters, $c, ANY $c.toLines != NULL).@count > 0")

【讨论】:

非常感谢您的回复!我尝试了您列出的所有案例,您是完全正确的。前 3 个因相同的错误而失败,但使用 SUBQUERY 它更改为“包含不应该有的 KVC 聚合的密钥路径”。现在正在研究它以弄清楚它的含义! @CodeNoob:在 SUBQUERY 中尝试 ANY $c.toLines != NULL 而不是 $c.toLines.@count > 0 马丁!!就是这样!!非常感谢!完美!!

以上是关于如何为对象计数多个关系创建谓词?核心数据 iOS Swift的主要内容,如果未能解决你的问题,请参考以下文章

核心数据关系中对象的谓词

核心数据和关系谓词

Core Data 嵌套数组计数

xCode / iOS - 需要帮助使核心数据搜索谓词工作

创建谓词来测试关系的数量

具有核心数据关系的 iOS 8 Swift NSFetchResult 谓词无法访问内部 ID