【问题标题】:How can I make a CKQuery without predicate?如何在没有谓词的情况下进行 CKQuery?
【发布时间】:2014-08-28 11:53:51
【问题描述】:

我需要查询所有记录类型,没有任何过滤。我尝试了两种方法:

let query = CKQuery(recordType: "Pm", predicate: nil)
let query = CKQuery(recordType: "Pm", predicate: NSPredicate(format: ""))

我收到错误:

'NSInvalidArgumentException',原因:'无法解析格式 字符串“”'

怎么办?

【问题讨论】:

    标签: swift nspredicate cloudkit ckquery


    【解决方案1】:

    你不能在没有谓词的情况下执行查询,但是 NSPredicate 确实有一个方法可以做到这一点,在 Swift 中它是通过初始化程序使用的:

    init(value: Bool) -> NSPredicate // return predicates that always evaluate to true/false
    

    用法如下。

    let predicate = NSPredicate(value: true)
    

    【讨论】:

    • 嗨,米克,您知道是否有另一种方法可以以管理员身份编写公共数据库、播种和维护数据,而无需 icloud 登录?完整问题:stackoverflow.com/questions/36808601/…
    • 根据 CKQuery API Reference:“谓词基于格式字符串。您不能使用基于值或块的谓词。”我不认为它总是这样,但目前这个答案不再有效。
    • @JamesLingo 这是不正确的。当提到“基于值或块的谓词”时,Apple 指的是基于闭包的谓词(例如CKQuery(recordType: "Pm", predicate: { $0.id == 42 }))。支持任何有效的 NSPredicate,并提供 NSPredicate(value:) 作为创建始终评估 truefalse 的 NSPredicate 的方法。
    • @MickMacCallum 文档特别指出您需要使用格式字符串并且不能使用块 值。如果您从我在 CKQuery API 参考文献中的最后一句引文往下看几段:“要检索给定类型的所有记录,请使用 TRUEPREDICATE 表达式,如清单 8 所示。”我目前正在审查一些以前使用“值:真”的旧代码,我必须对其进行更新以使其通过我的单元测试。 NSPredicate(value:) 是否仍在为您使用 CKQuery,如果是,您是否使用 swift 3.0?
    【解决方案2】:

    要获取所有记录,您需要将其用作 CKQuery 的谓词:

    [NSPredicate predicateWithFormat:@"TRUEPREDICATE"]
    

    或者,在 Swift 中:

    NSPredicate(format: "TRUEPREDICATE")
    

    这就像没有任何谓词一样有效。

    【讨论】:

    • 这应该是公认的答案
    • 这是 Apple 在文档中推荐的解决方案。您的答案可能没有任何问题,但给出 2 个解决方案,应首选记录的解决方案
    • 如果有人对此有疑问,请注意:我必须在 CloudKit 仪表板中的 Record 的 id 字段上启用索引。我不知道为什么,但是当我这样做时,@“TRUEPREDICATE”格式开始起作用。我得到的错误说明:“字段'___recordID'未标记为可查询”。这是我发现的有关此问题的堆栈:stackoverflow.com/questions/29142717/….
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-22
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多