在 Cloudkit 谓词上使用 OR 运算符

Posted

技术标签:

【中文标题】在 Cloudkit 谓词上使用 OR 运算符【英文标题】:Use of OR operator on Cloudkit predicate 【发布时间】:2016-05-18 23:41:02 【问题描述】:

我有一个包含 5 个字段的 cloudkit 记录:

Active
User1
User2
User3
User4

我正在尝试选择 4 个用户字段之一与 userID 变量匹配的记录。

4 个用户字段中只有一个与 userID 变量匹配。

这是我正在使用的代码:

var userID = "0984093843897"

predicate = NSPredicate(format: "userID1 = %@ OR userID2 = %@ OR userID3 = %@ OR userID4 = %@ AND active = %@", userID, userID, userID, userID, true)

基本上我想要实现的是类似于下面的声明:

if userID1 == userID || userID2 == userID || userID3 == userID || userID4 == userID && active = true

不幸的是,cloudkit 正在返回谓词格式错误。我不确定我在这里尝试做的事情是否可以通过 cloudkit 谓词实现,或者是否有更好的方法来做到这一点。

我在堆栈上找到的大多数示例都处理带有 AND 运算符的谓词,不知道如何使用 OR 运算符。查看 Apple Docs 它不存在,所以不确定是否有解决方法。

【问题讨论】:

您应该在问题中包含错误消息。 【参考方案1】:

Cloud Kit 的 CKQuery 不支持谓词中的 OR。请参阅CKQuery 的文档。它显示了所有受支持的谓词运算符,虽然支持 ANDNOT,但不支持 OR

OR 的一个可能替代品是IN。我只在您希望查看单个字段是否包含多个值之一的地方看到了这一点。但你的情况正好相反。请尝试以下方法,但可能不起作用。

var userID = "0984093843897"
NSPredicate(format:"%@ IN  %K, %K, %K, %K  AND active = true", userID, "userID1", "userID2", "userID3", "userID4"]

【讨论】:

我知道这已被标记为正确但是在我的测试中,虽然创建了谓词,但当您尝试将其应用于 CKQuery 时,会报告一个错误,指出“0984093843897”不是评估的对象表达。那么有人真的让这个工作了吗?

以上是关于在 Cloudkit 谓词上使用 OR 运算符的主要内容,如果未能解决你的问题,请参考以下文章

在 CloudKit 中使用比较谓词进行查询

在 CloudKit 谓词中使用包含比较数组的 CONTAINS 或 ANY

Swift / Cloudkit 谓词格式

CloudKit 谓词

iOS 谓词讲解

Prolog 箭头运算符