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

时间:2011-04-21 20:26:49

标签: objective-c nspredicate

我有一个ManagedObject class,其中一个成员是NSDate。我想显示未设置日期的类的所有对象。我尝试使用这样的谓词:

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

但我仍然可以获得设置date的对象。为此设置谓词的正确方法是什么?

4 个答案:

答案 0 :(得分:99)

我认为这是一个区分大小写的问题。您可以使用“nil”或“NULL”,但不能使用“NIL”。这对我来说很好:

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

答案 1 :(得分:10)

想出来。无法通过使用带有字符串格式的谓词来执行此操作,因此尝试使用模板的谓词并且它有效。这是给我的endDate设置为NULL的对象的代码:

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

答案 2 :(得分:3)

https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4

以下代码应该可以正常工作

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

答案 3 :(得分:0)

如Apple所记录的那样,获取请求的行为非常恼人:

  

如果已修改上下文中的对象,则会针对其修改状态评估谓词,而不是针对持久性存储中的当前状态。因此,如果上下文中的对象已被修改,使其满足获取请求的条件,则即使尚未将更改保存到商店并且商店中的值不符合条件,该请求也会检索它。相反,如果上下文中的对象已被修改,使其与获取请求不匹配,则即使存储中的版本匹配,获取请求也不会检索它。

您有可能在其他地方清除日期,并且获取请求包括结果,其中日期为nil在内存中但仍设置在磁盘上(在持久性存储中),等等当对象出现故障时,它会加载具有日期设置的对象。

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