2015-04-05 201 views
0

我正在尝试创建CloudKit文本搜索查询。 什么工作是记录的查询,像这样的搜索文本开头:如何执行包含令牌搜索的CloudKit全文搜索

NSPredicate(format: "Text BEGINSWITH %@", searchText)! 

令牌搜索中也可以(见询问如果输入一个关键词是某处记录)所示:

NSPredicate(format: "allTokens TOKENMATCHES[cdl] %@", searchText)! 

你可以看到这些查询演示程序关闭EVCloudKitDao工作(见截图)

但现在,我想这两个查询,这样的结果感到有点更完整的结合起来。我尝试使用此查询:

NSPredicate(format: "Text BEGINSWITH %@ OR allTokens TOKENMATCHES[cdl] %@", searchText, searchText)! 

但我会得到这个CloudKit错误:

Terminating app due to uncaught exception 'CKException', reason: 'Unexpected expression: Text BEGINSWITH "Y" OR 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]) 

但是,一个给大约相同的错误:

Terminating app due to uncaught exception 'CKException', reason: 'Unexpected expression: allTokens TOKENMATCHES[cdl] "y" OR Text BEGINSWITH "y"'

奇怪的是,它使用AndPredicateType而不是OrPredicateType时可以工作

有谁知道这种查询的备用解决方案吗? 由于它是用于自动完成功能的,因此执行2个查询并将结果组合起来并不是真正的选择。

+1

您是否尝试过使用NSCompoundPredicate? – 2015-04-07 15:52:54

+0

感谢您的提示。不幸的是它有相同的结果。它看起来像在谓词中使用OR有问题。 – 2015-04-07 19:10:49

回答

5

不幸的是,连接在CloudKit查询中不受支持。您唯一的选择是运行两个单独的查询,并将两者的结果合并到您的客户端中。

这不是很有效率,我们意识到这个限制。如果您有时间,请求此功能的快速雷达将会很有用。

更新:根据​​唯一支持的复合谓词运算符是AND,& &,NOT。 OR操作符在CloudKit中不受支持。这不是一个错误 - 它是服务器的一个已知限制。

+0

但它不是一个连接。它只有一个recordType的2个条件。当使用AND时它是可以的,当使用OR时你会得到错误。我认为OR查询存在问题。当谓词是:(从='我'和='你')或(从='你'和='我')过滤邮件时,我现在有同样的问题 – 2015-04-08 05:32:34

+1

根据[文档](https: //developer.apple.com/library/prerelease/ios/documentation/CloudKit/Reference/CKQuery_class/index.html)唯一支持的复合谓词运算符是AND,&&, NOT'。 CloudKit不支持'OR'运算符。这不是一个错误 - 它是服务器的一个已知限制。 – farktronix 2015-04-08 17:24:03

+0

啊!不能相信我已经读过。很奇怪,它不被支持。我会将其添加到答案中。你应得的奖金。 – 2015-04-09 21:45:06