【问题标题】:How to write a BOOL predicate in Core Data?如何在 Core Data 中编写 BOOL 谓词?
【发布时间】:2011-09-04 09:02:05
【问题描述】:

我有一个BOOL 类型的属性,我想搜索该属性为YES 的所有托管对象。

对于字符串属性,它很简单。我创建了一个这样的谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"userName = %@", userName];

但是,如果我有一个名为 selected 的 bool 属性并且我想为此做一个谓词,我该怎么做?我可以做这样的事情吗?

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"selected = %@", yesNumber];

或者我是否需要其他格式说明符并只传递YES

【问题讨论】:

    标签: iphone ios ipad core-data predicate


    【解决方案1】:

    来自Predicate Programming Guide

    您指定并测试布尔值的相等性,如以下示例所示:

    NSPredicate *newPredicate = [NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
    NSPredicate *testForTrue = [NSPredicate predicateWithFormat:@"anAttribute == YES"];
    

    您也可以查看Predicate Format String Syntax

    【讨论】:

    • @inorganik 我读过类似的声明here。我不知道这是什么原因,但我知道它应该工作并且对我有用。
    • @inorganik 我也尝试过它并且它有效(“它对我有用”)。我不知道你尝试了什么。我很好奇。如果需要,请分享一个测试用例的链接,以便我可以尝试完全相同的代码。
    • 我重新测试了,它工作了......所以我错了。一定是其他原因导致我的案子失败。无论哪种方式 +1 你的答案
    • @inorganik 哦,我明白了。如果您找出导致您的案件失败的原因,我很想知道。感谢您的+1! :)
    【解决方案2】:

    Swift 4.0

    let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
    

    【讨论】:

    • 有什么方法可以获取 bool 等于 nil 的所有对象?还是它总是必须是真或假??
    • @ApoorvMote,从 Xcode 9.4、Swift 4 开始,是的:如果您在谓词中使用常规 Bool 值,将找到具有 nil 属性值的项目。例如,将属性的值设置为 nil(我们会说您将其命名为 boolAttribute,如本答案所示)。然后,创建您的谓词:let predicate = NSPredicate(format: "boolAttribute == %@", boolValue)注意:boolValue 应该等于 truefalse,而不是 NSNumber(value: boolValue) 生成的谓词将是:boolAttribute == nil。该谓词返回boolAttributenil 的任何对象。可能不会永远工作......
    • 这是有效的。您也可以简单地使用“boolAttribute == 1”格式。
    【解决方案3】:

    不要转换为 NSNumber,也不要使用 double "=="

    更适合 Swift >= 4:

    NSPredicate(format: "boolAttribute = %d", true)
    

    注意:本例中的“true”是一个 Bool (a Struct)

    【讨论】:

    • 应该是新接受的答案。看在皮特的份上,2020 年了
    • 在将 NSPredicate 与 Core Data 一起使用时,这对我不起作用。只有NSNumber 版本有效(@Viktor 的回答)。
    【解决方案4】:

    斯威夫特 3

    let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
    

    在 Swift 3 中,您应该使用 NSNumber(value: true)

    不鼓励直接使用NSNumber(booleanLiteral: true) 和一般任何文字初始化程序,例如SwiftLint(v.0.16.1)将生成警告使用ExpressibleBy...Literal直接初始化程序:

    编译器协议初始化违规:不应直接调用在编译器协议中声明的初始化程序,例如 ExpressibleByArrayLiteral。 (compiler_protocol_init)

    【讨论】:

    • 或者:NSPredicate(format: "boolAttribute == %@", true as NSNumber)
    【解决方案5】:

    斯威夫特 4

    request.predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(value: true))
    

    斯威夫特 3

    request.predicate = NSPredicate(format: "field = %@", value as CVarArg)
    

    【讨论】:

    • 这会导致 Xcode 9.3 和 Swift 4.1 崩溃。请改用this method
    【解决方案6】:

    Swift 3.0 对此做了些许改动:

    let predicate = NSPredicate(format: "boolAttribute == %@", NSNumber(booleanLiteral: true))
    

    【讨论】:

      【解决方案7】:

      如果您不想在格式中硬编码属性名称,您可以使用 #keyPath 类似的东西,

      let samplePredicate = NSPredicate(format: "%K != %d", #keyPath(Foo.attr), true)
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多