2016-04-15 63 views
0

我需要從匹配字符串的cloudkit中提取記錄。Cloudkit的NSPredicate匹配字符串

我有一個用戶記錄類型,帶有一個電子郵件字段。我使用同一封電子郵件發送多個記錄,但我無法使用謂詞來獲取記錄。

我已經嘗試了所有的這些:

let predicate = NSPredicate(format: "email = '[email protected]'") 
NSPredicate(format: "email == %@", argumentArray: [email]) 
NSPredicate(format: "email IN %@", [email]) 
NSPredicate(format: "email contains %@", email) 
NSPredicate(format: "email = %@", email) 
NSPredicate(format: "email == %@", email) 

我的查詢指定的記錄類型:

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email == %@", email)) 

當我做了謂詞值:真的,我得到的所有記錄,包括一我想..我知道肯定我有一個用戶與該電子郵件,實際上是多個..

我錯過了什麼?

編輯..

let query = CKQuery(recordType: "User", predicate: NSPredicate(format: "email BEGINSWITH %@", email)) 

不工作並帶回記錄,但我想完全匹配!

+0

的是否'LIKE'代替''==工作? – HAS

回答

1

我一直在與我的一個應用程序有這個相同的問題。就我而言,我需要訂閱一個謂詞列表,其中需要滿足很多搜索條件,但搜索或過濾謂詞給了我最大的麻煩。我也試過:

let word1 = "Mac" 

let predicate = NSPredicate(format: "Title CONTAINS %@", word1) 

這個工作,但只有當「字1」是不帶空格的一個單詞,「標題」是在雲中「字符串列表」。

,我在我所有的研究遇到的澄清是:

你需要,當你創建一個謂語,這是什麼做的是它會搜索是一個搜索字符串中的字段使用「自我」一詞。下面是我從Apple's Website.獲得的信息

謂詞支持以下變量替換字符串:

使用%@的值對象,如字符串,數字和日期。

使用%K作爲字段的名稱。此替換變量指示應使用替換字符串查找字段名稱。

有一個例外,CONTAINS運算符只能用於測試列表成員資格。例外情況是當您使用它來執行與自身鍵路徑一起的全文搜索時。自我關鍵路徑會導致服務器在指定的標記字符串中查找可搜索的基於字符串的字段。例如,@「self」的謂詞字符串包含'blue'「在標記爲包含在全文搜索中的所有字段中搜索單詞」blue「。您不能使用自我鍵路徑在類型不是字符串的字段中搜索。

我最終做了什麼,它必須有更好的方式,是我的'標題'屬性仍然是雲中的'字符串列表',在我的代碼中,我製作了所有單詞的數組我的searchTerm和searchTerm中的每個單詞我做了一個單獨的NSPredicate,並將它們用作NSCompoundPredicate的一部分。然後,我將NSCompoundPredicate添加到我的訂閱中,並且工作正常。這裏是我的例子:

var searchCriteria: [NSPredicate] = [] 

for word in searchTerm { 
    let predicate = NSPredicate(format: "self CONTAINS %@", word) 
    searchCriteria.append(predicate) 
} 

let p2 = NSPredicate(format: "Price > %d", minPrice) 

let p3 = NSPredicate(format: "Price < %d", maxPrice) 

let p4 = NSPredicate(format: "Category == %d", category) 

searchCriteria.append(p2) 
searchCriteria.append(p3) 
searchCriteria.append(p4) 

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: searchCriteria) 

我希望這有助於。必須有更好的方法來做到這一點,如果有人知道,請讓我知道,因爲我知道有關如何使用CloudKit做的事情沒有太多好的解釋。

+0

有趣的是,你評論過,因爲蘋果回覆我的問題說這個問題已經解決......但我還沒有能夠測試它,因爲我沒有編碼我的電子郵件,並且自那之後就沒有問題了。 – JDM

+0

這很有趣。那麼如果你最終測試它,它適用於你,請讓我知道你是如何做到的。 – avanalfen

1

我有同樣的問題,並能解決它通過在我的情況下在用戶字段添加可查詢索引。請注意,添加索引後,我需要再次將數據寫入CloudKit才能執行查詢。

代碼創建謂詞:

let user = "test-user" 
let userPredicate = NSPredicate(format: "user == %@", user)