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

58

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

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

但我仍然会得到设置了date的对象。 为此,应该如何设置谓词?

4个回答

109

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

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

1
你知道为什么格式应该是@"endDate = nil"而不是@"endDate == nil"吗?我本以为一定应该是双等号,但在这种情况下==并不能产生预期的效果。奇怪的是,其他谓词比较使用==确实有效。 - kris
1
@kris 我不确定。http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Predicates/Articles/pSyntax.html#//apple_ref/doc/uid/TP40001795-SW1 似乎表明 === 是等价的,但是 http://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//apple_ref/doc/uid/TP40001794-SW4 中的示例使用了 = - Christopher Pickslay
10
谢谢。我发现在这种情况下,= 和 == 的行为不同,所以提醒大家注意。 - kris
它们有什么不同? - fatuhoku
克里斯,有什么区别吗? - Ricardo
2
根据苹果的文档,在谓词中,===是等价的。 - Bartłomiej Semańczyk

10

搞定了。不能使用带有字符串格式的谓词,因此尝试使用带有模板的谓词,这样就行了。以下是使endDate设置为NULL的代码:

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

坦白说,考虑到chrispix所提供的通过谓词测试null的语法不规则性,我会觉得采用以下更简单的示例比较安全,他和kris讨论了这个问题。 - Wienke
谢谢!但是如果需要两个过滤变量,你该如何进行筛选呢?谢谢。 - KarenAnne

3

0

有一种非常烦人的fetch请求行为,由Apple记录:

如果上下文中的对象已被修改,则谓词将针对其修改后的状态进行评估,而不是针对持久存储中的当前状态。因此,如果上下文中的对象已被修改,以满足fetch请求的条件,则即使未将更改保存到存储中且存储中的值不满足条件,请求也会检索它。相反,如果上下文中的对象已被修改,以使其不匹配fetch请求,则即使存储中的版本匹配,fetch请求也不会检索它。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接