我有一个表“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">
答案 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;