2014-11-07 56 views
1

我有一個表「存儲」的屬性「名稱」類型的字符串(索引檢查排序查詢和搜索)。 我想執行一個類似於SQL的查詢來查找名稱以子字符串開頭的所有商店。NSPredicate和BEGINSWITH與CloudKit:字段值類型不匹配

所以,我想這個謂詞:

NSPredicate *pred = [NSPredicate predicateWithFormat:@"ANY name BEGINSWITH %@",substring]; 

CKQuery *query = [[CKQuery alloc]initWithRecordType:@"Store" predicate:pred]; 

CKQueryOperation *queryOperation = [[CKQueryOperation alloc] initWithQuery:query]; 

queryOperation.desiredKeys = @[@"name",@"category"]; 

NSMutableArray *results = [[NSMutableArray alloc] init]; 

queryOperation.recordFetchedBlock = ^(CKRecord *record) { 
    [results addObject:record]; 
}; 
queryOperation.queryCompletionBlock = ^(CKQueryCursor *cursor, NSError *error) { 
    //my own code 
} 
[publicDatabase addOperation:queryOperation]; 

我有這樣的錯誤:

<CKError 0x1887a540: "Invalid Arguments" (12/1009); "Field value type mismatch in query predicate for field 'name'"> for query : <CKQuery: 0x18882650; recordType=Store, predicate=ANY name BEGINSWITH "mysubstring"> 

回答

1

我的猜測是你需要擺脫「任何」。

所以任何是列表(數組)。由於'名稱'是一個字符串,它不是一個列表,因此不匹配錯誤:「字段值類型不匹配在字段'名稱'的查詢謂詞中」

+0

好的謝謝,但我怎麼能執行一個查詢來查找所有與「我的」子字符串「開始」名稱「或」類別「的商店? – 2014-11-17 22:50:16

+0

@John我不確定你是否可以直接做。您可以嘗試全文搜索,如另一個答案所示,或者您可以創建一個新字段,該字段是一個字符串數組。然後,您可以使用ANY:「ANY searchableFields BEGINSWITH%@」,其中searchableFields是記錄中的一個新字段,它是一個包含兩個元素(名稱和類別)的數組。 – 2014-11-18 02:54:18

1

胡亂猜測...嘗試:

[NSPredicate predicateWithFormat:@"ANY {'name','category'} BEGINSWITH %@",substring]; 

這可能是一個不正確的逆轉鍵/值,但它可能工作。

+0

它是否適合您?因爲我有這個錯誤:***終止應用程序由於未捕獲的異常'CKException',原因:'意外的表達式:ANY {「名稱」,「類別」} BEGINSWITH「mysubstring」' – 2014-11-10 14:13:47

+0

如果我使用[NSPredicate predicateWithFormat:@「任何名稱BEGINSWITH'mysubstring'「]它不會返回任何有performQuery但沒有記錄的錯誤,並且如果我將它與CKQueryOperation一起使用,它將返回一個錯誤:的查詢謂詞中的字段值類型不匹配: 2014-11-10 14:21:59

+0

我簡化了問題並打開了一個解決CKError的懸賞。 – 2014-11-13 15:16:14

1

完全不同的方法是創建名爲「nameAndCategory」的第三個字段,將兩個字符串附加並添加到字段中。然後弄清楚如何與謂詞做全文搜索(標記化的字符串搜索):

[NSPredicate predicateWithFormat:@"self contains '%@'",substring]; 

[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"self contains '%@'",substring]; 

但也許是唯一確定的方法就是做兩個搜索和合並結果。

+0

我簡化了這個問題,並打開了一個解決CKError的懸賞。 – 2014-11-13 15:17:21