MacOS:NSPredicate 查找“一对一”关系不为零的位置

Posted

技术标签:

【中文标题】MacOS:NSPredicate 查找“一对一”关系不为零的位置【英文标题】:MacOS: NSPredicate find where "one to one" relationship is not nil 【发布时间】:2014-09-25 21:26:34 【问题描述】:

我正在尝试使用NSPredicate 过滤核心数据获取请求。谓词字符串如下所示:

"stringProperty = %@ && dateProperty > %@ && oneToOneRelationship != nil"

这不返回任何对象。但是,如果我省略最后一个子句,它会这样做。如果我将最后一个子句更改为"oneToOneRelationship = nil",那么它确实如此。当然,这最后两种情况并没有返回我真正想要的数据。 :)

是否有适当的方法来搜索存在关系且不为零的一对一关系?似乎谓词应该有效,但事实并非如此。这是在使用 Xcode 6.1 beta 的当前 Yosemite beta 上。

有人有什么想法吗?

【问题讨论】:

【参考方案1】:

实际上,“!= nil”测试运行良好。事实证明,虽然我认为一对一的关系正在设置,但实际上并没有。所以,谓词工作正常。当然,是我的代码出错了。

【讨论】:

【参考方案2】:

使用oneToOneRelationship.@count != 0。以下代码应该可以工作:

斯威夫特:

let predicate = NSPredicate(format: "stringProperty == %@ && dateProperty > %@ && oneToOneRelationship.@count != 0", argumentArray:[stringProperty, dateProperty])
fetchRequest.predicate = predicate

目标-C:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"stringProperty == %@ && dateProperty > %@ && oneToOneRelationship.@count != 0", stringProperty, dateProperty];
[fetchRequest setPredicate:predicate];

【讨论】:

很奇怪(好吧,对我来说很奇怪),它奏效了!我没想到@count 会为一对一的关系工作。奇怪的是,虽然对“@count != 0”的测试有效,但对“@count = 1”的测试却没有。一定会喜欢 NSPredicate 的变幻莫测... 实际上,@count 不适用于一对一的关系。原来的 != nil 测试正在工作。事实证明关系没有设置,所以当然,它没有被 fetch 请求找到。

以上是关于MacOS:NSPredicate 查找“一对一”关系不为零的位置的主要内容,如果未能解决你的问题,请参考以下文章

基于 Agora SDK 实现 macOS 端的一对一视频通话

NSPredicate 与关系

如何使用 NSPredicate 在字符串中查找开头的单词?

具有关系子实体属性的 NSPredicate

NSPredicate 仅查找第一个匹配项

核心数据:在两个实体中查找的 NSPredicate