2015-04-05 142 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