如何根据多对关系集是不是包含特定值使用 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 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章
过滤具有多对多关系的对象,检查它是不是包含列表中的至少一个元素