Objective c 如何设置NSPredicate以查找具有nil属性的对象

Objective c 如何设置NSPredicate以查找具有nil属性的对象,objective-c,nspredicate,Objective C,Nspredicate,我有一个ManagedObject类,该类的一个成员是NSDate。我想显示未设置日期的类的所有对象。我尝试使用如下谓词: NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"]; 但是我仍然得到设置了日期的对象。设置谓词的正确方法是什么?找到了答案。无法使用带有字符串格式的谓词,因此尝试了带有模板的谓词,结果成功了。以下代码为我提供了endDate设置为NULL的对象: NSPredicate *

我有一个
ManagedObject类
,该类的一个成员是
NSDate
。我想显示未设置日期的类的所有对象。我尝试使用如下谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];

但是我仍然得到设置了
日期的对象。设置谓词的正确方法是什么?

找到了答案。无法使用带有字符串格式的谓词,因此尝试了带有模板的谓词,结果成功了。以下代码为我提供了endDate设置为NULL的对象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];

我明白了。无法使用带有字符串格式的谓词,因此尝试了带有模板的谓词,结果成功了。以下代码为我提供了endDate设置为NULL的对象:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];

我认为这是一个案件敏感性问题。您可以使用“nil”或“NULL”,但不能使用“nil”。这对我来说很好:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];

我认为这是一个案件敏感性问题。您可以使用“nil”或“NULL”,但不能使用“nil”。这对我来说很好:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];

下面的代码应该可以工作

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];

下面的代码应该可以工作

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];

正如苹果公司所记录的,获取请求有一种非常恼人的行为:

如果上下文中的对象已被修改,则谓词将根据其已修改状态而不是持久存储中的当前状态进行求值。因此,如果对上下文中的对象进行了修改,使其符合提取请求的条件,则即使尚未将更改保存到存储并且存储中的值不符合条件,请求也会检索该对象。相反,如果上下文中的对象已被修改,使其与提取请求不匹配,则即使存储中的版本匹配,提取请求也不会检索该对象

您可能正在清除其他位置的日期,而获取请求包含的结果是内存中的日期为
nil
,但仍在磁盘(在持久存储中)上设置,因此,当对象发生故障时,它将使用设置的日期加载对象


我唯一的建议是协调对托管对象上下文的访问(例如,在
NSOperationQueue
上),以便在执行提取请求之前,能够将任何更新保存到持久存储中

正如苹果公司所记录的,获取请求有一种非常恼人的行为:

如果上下文中的对象已被修改,则谓词将根据其已修改状态而不是持久存储中的当前状态进行求值。因此,如果对上下文中的对象进行了修改,使其符合提取请求的条件,则即使尚未将更改保存到存储并且存储中的值不符合条件,请求也会检索该对象。相反,如果上下文中的对象已被修改,使其与提取请求不匹配,则即使存储中的版本匹配,提取请求也不会检索该对象

您可能正在清除其他位置的日期,而获取请求包含的结果是内存中的日期为
nil
,但仍在磁盘(在持久存储中)上设置,因此,当对象发生故障时,它将使用设置的日期加载对象


我唯一的建议是协调对托管对象上下文的访问(例如,在
NSOperationQueue
上),以便在执行提取请求之前,能够将任何更新保存到持久存储中

你知道为什么格式应该是@“endDate=nil”而不是@“endDate=nil”吗?我肯定会认为它应该是双等号,但在这种情况下==不会产生期望的效果。奇怪,因为其他谓词比较确实与==。@kris一起工作,我不确定。似乎表明
=
=
是等效的,但是使用中的示例
=
谢谢。我发现=和==在这种情况下表现不一样,所以请大家注意它们是如何不一样的?根据
=
=
在谓词中是等价的。你知道为什么格式应该是@“endDate=nil”而不是@“endDate==nil”吗?我肯定会认为它应该是双等号,但在这种情况下==不会产生期望的效果。奇怪,因为其他谓词比较确实与==。@kris一起工作,我不确定。似乎表明
=
=
是等效的,但是使用中的示例
=
谢谢。我发现=和==在这种情况下表现不一样,所以请大家注意它们是怎么不一样的?根据
=
=
在谓词中是等价的坦白地说,我觉得这样做比下面chrispix给出的简单示例更安全,考虑到他和克里斯讨论的通过谓词测试null的语法不规则性。谢谢!!但是如果它需要两个过滤变量,您将如何过滤呢?非常感谢,考虑到他和克里斯讨论过的通过谓词测试null的语法不规则性,我觉得这样做比遵循下面简单的chrispix示例更安全。谢谢!!但是如果它需要两个过滤变量,您将如何过滤呢?谢谢