如何为对象创建谓词深入几个关系?核心数据iOS Swift

时间:2014-09-11 18:29:17

标签: ios core-data swift predicate

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

场景< - >>字符< - >>行

实体具有以下关系:Scenes-> toCharacters-> Characters-> toLines-> Lines

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

我读过的每篇文章都只是简单地谈论"行走图表",这个DOES有效,但不是一直到LINE实体。

例如,这个谓词工作正常,深入一级并检索包含字符的所有场景:

    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)'

这里有什么非常简单的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:10)

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

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")