如何根据多对关系集是不是包含特定值使用 NSPredicate 进行过滤

Posted

技术标签:

【中文标题】如何根据多对关系集是不是包含特定值使用 NSPredicate 进行过滤【英文标题】:How to filter using NSPredicate based on if the to many relationship set contains a specific value如何根据多对关系集是否包含特定值使用 NSPredicate 进行过滤 【发布时间】:2016-12-05 14:08:57 【问题描述】:

我有两个实体。一个实体Person,另一个Message。对于每个人,有许多消息(因此存在一对多关系)。我需要用 Persons 填充我的 tableView,但只有具有一组消息的 Persons 至少有一条消息,其属性为sent 等于success

如果我说的不清楚,这里基本上就是我想要的:

(显然这不会编译,为了这个问题我完全弥补了)NSPredicate(Person.messages.contains (sent == "success")

编辑: 忘了提到我正在使用 Core - Data,而不仅仅是一个常规数组。我需要 NSPredicate 来获取结果控制器。

【问题讨论】:

你的谓词中的“朋友”是什么? 让我编辑一下,我的意思是人。对不起 NSPredicate(format: "ANY messages.sent == %@", "success") 之类的东西应该可以工作。你看过developer.apple.com/library/content/documentation/Cocoa/…吗? 非常感谢 Martin R!我找不到文档的快速版本。另外,您的答案看起来应该可行! 【参考方案1】:

"ANY" 可以与一对多关系一起使用来查找 至少有一个相关对象满足的对象 一个条件。在你的情况下:

 NSPredicate(format: "ANY messages.sent == %@", "success")

【讨论】:

【参考方案2】:

你可以像这样在 swift 数组上使用过滤器函数:

struct Person 

    var name: String?
    var meessages = [Message]()



struct Message 

    var sent: Bool = false



let arr: [Person] = [
    Person(name: "person1", meessages: [Message(sent: true), Message(sent: false)]),
    Person(name: "person2", meessages: [Message(sent: false), Message(sent: false)]),
    Person(name: "person2", meessages: [Message(sent: true), Message(sent: true)])
]

let filtered = arr.filter( ($0.meessages.filter( $0.sent == true )).count > 0 )

【讨论】:

ThomasG,非常感谢您的回答,虽然我需要一个 NSPredicate 用于核心数据以用于我的获取结果控制器,但我应该更清楚。【参考方案3】:

那是因为您的 Persons Array 应该是 NSArray , NSPredicates 仅适用于 Foundation 对象而不是 swift types.in Swift 数组 你有过滤器方法,你可以调用它并将它传递给过滤闭包。

【讨论】:

以上是关于如何根据多对关系集是不是包含特定值使用 NSPredicate 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

连接空间连接与关联

过滤具有多对多关系的对象,检查它是不是包含列表中的至少一个元素

如何根据多对多关系选择用户子集?

Django如何过滤多对多字段中的对象,而不是原始查询集

Django:在多对多关系中查找所有值,其中相关集合的所有元素都符合特定条件

多对多关系的 DQL 语句