2014-11-07 26 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