如何为对象计数多个关系创建谓词?核心数据 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的主要内容,如果未能解决你的问题,请参考以下文章