我正在尝试创建CloudKit文本搜索查询。 什么工作是查询以搜索文本开头的记录,如下所示:
NSPredicate(format: "Text BEGINSWITH %@", searchText)!
令牌搜索也有效(查询其中一个输入的单词是否在记录中的某个位置),如下所示:
NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)!
您可以在EVCloudKitDao关闭演示应用中查看这些查询(参见屏幕截图)
但是现在我想结合这两个查询,以便结果感觉更完整。我尝试使用此查询:
NSPredicate(format: "Text BEGINSWITH %@ OR allTokens TOKENMATCHES[cdl] %@", searchText, searchText)!
但是我会得到这个CloudKit错误:
因未捕获的异常终止应用程序' CKException',原因: '意外的表达:文字BEGINSWITH" Y"或者allTokens TOKENMATCHES [cdl]" Y"'
除此之外,我还尝试过这样的NSCompoundPredicate:
var p1 = NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)!
var p2 = NSPredicate(format: "Text BEGINSWITH %@", searchText)!
var p = NSCompoundPredicate(type: NSCompoundPredicateType.OrPredicateType, subpredicates: [p1, p2])
但是那个给出了同样的错误:
因未捕获的异常终止应用程序' CKException',原因: '意外表达:allTokens TOKENMATCHES [cdl]" y"或文字 BEGINSWITH" y"'
奇怪的是,它在使用AndPredicateType而不是OrPredicateType
时确实有效有没有人知道像这样的查询的替代解决方案? 由于它是自动完成功能,执行2次查询并合并结果不是一个真正的选择。
答案 0 :(得分:6)
不幸的是,CloudKit查询不支持联接。您唯一的选择是运行两个单独的查询,并将两者的结果合并到您的客户端中。
效率不高,我们已经意识到这个限制。如果你有时间,快速雷达请求这个功能将是有用的。
更新:根据documentation,唯一支持的复合谓词运算符是AND,&&,NOT。 CloudKit不支持OR运算符。这不是一个错误 - 它是服务器的已知限制。