【问题标题】:IOS - Swift: OrPredicate in CloudKit results in invalidIOS - Swift:CloudKit 中的 OrPredicate 导致无效
【发布时间】:2016-09-09 04:24:57
【问题描述】:

我有这个位来检索两个用户之间的所有消息:

let user1 = "john"
let user2 = "mark"
let predicateUser1To2 = NSPredicate(format: "user1 == %@", user1)
let predicateUser2From1 = NSPredicate(format: "user2 == %@", user2)

let predicateUser2To1 = NSPredicate(format: "user2 == %@", user1)
let predicateUser1From2 = NSPredicate(format: "user1 == %@", user2)

let predicate1To2 = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateUser1To2, predicateUser2From1])
let predicate2To1 = NSCompoundPredicate(andPredicateWithSubpredicates: [predicateUser1From2, predicateUser2To1])
let predicate = NSCompoundPredicate(orPredicateWithSubpredicates: [predicate1To2, predicate2To1])

let query = CKQuery(recordType: "Chat", predicate: predicate)

但它会引发以下错误。好像评价对了,怎么错了!?

*** 由于未捕获的异常“CKException”而终止应用程序,原因: '无效谓词: (user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") (错误域=CKErrorDomain 代码=12 "(user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") 不是比较谓词" UserInfo={NSLocalizedDescription=(user1 == "john" AND user2 == "mark") OR (user1 == "mark" AND user2 == "john") 不是比较 谓词,ck_isComparisonError=true})'

【问题讨论】:

  • 最简单的选择当然是执行单独的查询并对它们的结果进行 OR 运算。

标签: ios swift nspredicate cloudkit


【解决方案1】:

CloudKit 不支持 OR 查询。有关更多信息,请参阅: https://developer.apple.com/library/ios/documentation/CloudKit/Reference/CKQuery_class/

在很多情况下,您可以通过使用in 谓词来解决此问题,但这仅适用于一个字段。在您的情况下,您可能会考虑这样的谓词:

NSPredicate(format: "user1 in %@ AND user2 in %@", ["john", "mark"], ["john", "mark"])

这个仍然与您的样本不完全相同。可能是 user1 与 user2 相同。例如,两者都可以是标记。在您的情况下,未选择该记录,并且在上面的示例中选择了该记录。您可以添加一个额外的 AND 条件来排除这些。您可以添加:AND user1 != user2

如果查询变得更复杂并且无法进行in 查询,那么您可以执行 2 个查询并合并结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-12
    • 1970-01-01
    • 2021-10-16
    • 2014-04-25
    相关资源
    最近更新 更多