我有一个ManagedObject class
,其中一个成员是NSDate
。我想显示未设置日期的类的所有对象。我尝试使用这样的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];
但我仍然可以获得设置date
的对象。为此设置谓词的正确方法是什么?
答案 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)
以下代码应该可以正常工作
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
答案 3 :(得分:0)
如Apple所记录的那样,获取请求的行为非常恼人:
如果已修改上下文中的对象,则会针对其修改状态评估谓词,而不是针对持久性存储中的当前状态。因此,如果上下文中的对象已被修改,使其满足获取请求的条件,则即使尚未将更改保存到商店并且商店中的值不符合条件,该请求也会检索它。相反,如果上下文中的对象已被修改,使其与获取请求不匹配,则即使存储中的版本匹配,获取请求也不会检索它。
您有可能在其他地方清除日期,并且获取请求包括结果,其中日期为nil
在内存中但仍设置在磁盘上(在持久性存储中),等等当对象出现故障时,它会加载具有日期设置的对象。
我唯一的建议是协调对托管对象上下文的访问(例如,在NSOperationQueue
上),以便在执行获取请求之前能够将任何更新保存到持久性存储中。