在 NSPredicate 中使用 NSNumber == nil 过滤值
Posted
技术标签:
【中文标题】在 NSPredicate 中使用 NSNumber == nil 过滤值【英文标题】:Filtering values with NSNumber == nil in NSPredicate 【发布时间】:2016-09-12 14:26:26 【问题描述】:我正在尝试按 NSNumber 类型的属性选择值,如果 property==intValue 或 property==nil。 但是这段代码忽略了 property==nil 的值。 有什么意义?
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"(ANY region.beacons.major == %d OR ANY region.beacons.major = nil)
AND (ANY region.beacons.minor == %d OR ANY region.beacons.minor = nil)",
rangedBeacon.major.intValue, rangedBeacon.minor.intValue];
UPD:最简单的也行不通:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"ANY region.beacons.minor = nil"];
UPD 2:可能是因为 ANY+nil 的问题 根据这个答案Core Data, NSPredicate, ANY key.path == nil ANY 只选择 NOTNULL 值。
【问题讨论】:
为什么要复制?我不明白uint16_t
的东西,因为它不是一个对象,它不应该是零。为什么不是NSNumber
?你不是在使用CLBeacon
对象吗?
我重复了这个问题,因为现在标记为重复的 brevios 并链接到错误的答案。是的,我正在使用 CLBeacon。
好吧,根据链接的答案,你应该在你的谓词中写nil
而不是NIL
,修改你的代码没有反映。现在,我在之前的评论中提出的其他问题呢?
Larme,对不起,我匆忙复制了上一个问题。我将 NIL 更正为 nil,但这并没有帮助。
重复问题的答案有什么问题?您在此处发布的代码与您上一个问题的重复答案中的显示方式不同。
【参考方案1】:
只测试minor的属性之一;例如:
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"region.beacons.minor.length = 0"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:
@"region.beacons.minor.stringValue = nil"];
编辑我认识到,您应该删除 ANY
如果 minor
为 nil,则任何调用也将返回 nil,或者对于数字类型返回 0。
【讨论】:
【参考方案2】:一方面,我注意到您使用 assignment 运算符 =
而不是 equality ==
与 nil
进行比较。
另外,尝试与 Singleton NSNull 实例[NSNull null]
进行比较。
【讨论】:
在谓词中,=
不是赋值。以上是关于在 NSPredicate 中使用 NSNumber == nil 过滤值的主要内容,如果未能解决你的问题,请参考以下文章
在 NSPredicate 中使用 ALL/ANY/NONE
在 NSPredicate 中使用 NSNumber == nil 过滤值
在目标 c 中使用 nspredicate 时如何解决空间问题?