【问题标题】:NSPredicate with boolean is not comparing a boolean to NO带有布尔值的 NSPredicate 不会将布尔值与 NO 进行比较
【发布时间】:2011-11-04 19:31:47
【问题描述】:

我正在使用 CoreData,我的实体有一个名为“isReward”的布尔属性。

我正在尝试获取实体并过滤掉 isReward == YES 的所有结果。

isReward != YES 不起作用。

isReward == NO 不起作用。

NSPredicate predicateWithFormat:"isReward != %@", [NSNumber numberWithBool:YES]] 不起作用

isReward == Nil 有效。

什么给了?

【问题讨论】:

  • 您是如何在实体类中声明“isReward”属性的?
  • 这是一个可选的布尔值,没有默认值。这就是它为零的原因吗?我认为 ([nilValue] != YES) 会为真。
  • 你是否为这个实体定义了一个 Objective-C 类?如果是,这个类属性的定义是怎样的?
  • @Christian IIRC,没有默认值意味着既不是NO也不是YES,这是nil,对于Core Data,nil != NO

标签: cocoa core-data nspredicate


【解决方案1】:

我猜你会想要的:

[NSPredicate predicateWithFormat:@"isReward = NO OR isReward = nil"]

(根据 Apple 文档 here,与 NO 的直接比较应该是有效的。)

一般来说,当在数据方面与 null/nil 进行比较时,null == false 的计算结果为 false 并且 null != false 的计算结果为 false。与null 的比较通常评估为false,除非在测试IS NULL 时。

我还要说,当您搜索平等而不是不平等时,一般而言,索引会为您提供更好的结果。在您的情况下,这很容易重构(尽管我不确定它对 Core Data 是否重要)。

此外,如果您希望它始终为YESNO(并跳过对nil 的检查),您需要将默认设置显式设置为NO

但是,在您的应用程序明确设置之前,将其保留为nil 可能具有一些语义价值。这真的取决于你想要做什么。

【讨论】:

猜你喜欢
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多