【问题标题】:How do I set up a NSPredicate to look for objects that have a nil attribute如何设置 NSPredicate 来查找具有 nil 属性的对象
【发布时间】:2011-08-10 14:28:00
【问题描述】:

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

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

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

【问题讨论】:

    标签: objective-c nspredicate


    【解决方案1】:

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

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

    【讨论】:

    【解决方案2】:

    想通了。无法通过使用具有字符串格式的谓词来做到这一点,因此尝试了带有模板的谓词并且它起作用了。下面的代码给了我将 endDate 设置为 NULL 的对象:

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

    【讨论】:

    • 坦率地说,考虑到通过他和 kris 讨论的谓词测试 null 的语法不规则性,我觉得这样做比遵循 chrispix 下面给出的更简单的示例更安全。
    • 谢谢!!但是,如果它需要两个过滤器变量,您将如何过滤?谢谢
    【解决方案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"];
    

    【讨论】:

      【解决方案4】:

      正如 Apple 所记录的,获取请求的行为非常烦人:

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-11-23
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 2013-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多