使用CloudKit的NSPredicate和BEGINSWITH:字段值类型不匹配

时间:2014-11-07 00:54:18

标签: ios sql nspredicate cloudkit

我有一个表“Store”,其属性为“name”,类型为String(为排序查询和搜索检查索引)。 我想执行类似SQL的查询来查找名称以子字符串开头的所有商店。

所以我尝试了这个谓词:

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">

3 个答案:

答案 0 :(得分:1)

疯狂猜测......试试:

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

这可能是键/值的错误反转,但它可能有效。

答案 1 :(得分:1)

一种完全不同的方法是创建名为&#34; nameAndCategory&#34;的第三个字段,附加两个字符串并将它们添加到字段中。然后弄清楚如何使用谓词进行全文搜索(标记化字符串搜索):

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

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

但也许唯一可靠的方法是进行两次搜索并合并结果。

答案 2 :(得分:1)

我的猜测是你需要摆脱&#34; ANY&#34;。

  

ANY和SOME聚合运算符可以与IN和   包含运算符以执行列表成员资格测试。

所以任何列表(数组)。因为&#39; name&#39;是字符串,它不是列表,因此不匹配错误:&#34;字段值类型不匹配查询谓词中的字段&#39;名称&#39;&#34;