我有一个ManagedObject类
,其中一个成员是NSDate
。我想显示所有日期未设置的类的对象。我尝试使用这样的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];
但我仍然会得到设置了date
的对象。 为此,应该如何设置谓词?
我有一个ManagedObject类
,其中一个成员是NSDate
。我想显示所有日期未设置的类的对象。我尝试使用这样的谓词:
NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];
但我仍然会得到设置了date
的对象。 为此,应该如何设置谓词?
我认为这是一个大小写敏感的问题。您可以使用"nil"或"NULL",但不能使用"NIL"。这对我来说很好用:
NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];
搞定了。不能使用带有字符串格式的谓词,因此尝试使用带有模板的谓词,这样就行了。以下是使endDate设置为NULL的代码:
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
[NSDictionary dictionaryWithObject:[NSNull null] forKey: @"DATE"]];
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
有一种非常烦人的fetch请求行为,由Apple记录:
如果上下文中的对象已被修改,则谓词将针对其修改后的状态进行评估,而不是针对持久存储中的当前状态。因此,如果上下文中的对象已被修改,以满足fetch请求的条件,则即使未将更改保存到存储中且存储中的值不满足条件,请求也会检索它。相反,如果上下文中的对象已被修改,以使其不匹配fetch请求,则即使存储中的版本匹配,fetch请求也不会检索它。
可能在其他地方清除了日期,并且fetch请求包括内存中日期为nil
但仍在磁盘(持久存储)上设置的结果,因此当对象故障时,它会加载具有设置日期的对象。
我的唯一建议是协调访问托管对象上下文(例如,在NSOperationQueue
上),以便在执行fetch请求之前能够保存任何更新到持久存储中。
=
和==
是等价的,但是 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4 中的示例使用了=
。 - Christopher Pickslay=
和==
是等价的。 - Bartłomiej Semańczyk