在 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 过滤值

使用核心数据在 NSPredicate 中调用对象的方法

在目标 c 中使用 nspredicate 时如何解决空间问题?

Swift NSPredicate SUBQUERY with NOT IN?

在 NSPredicate 中使用带有 ISBN 数字示例的正则表达式令人困惑