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

问题描述 投票:1回答:3

我有一个表“Store”,其属性为String类型的“name”(为排序查询和搜索检查索引)。我想执行类似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">
ios sql nspredicate cloudkit
3个回答
1
投票

我的猜测是你需要摆脱“任何”。

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

所以任何是列表(数组)。由于'name'是String,因此它不是列表,因此不匹配错误:“字段'name'的查询谓词中的字段值类型不匹配”


1
投票

疯狂的猜测...尝试:

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

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


1
投票

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

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

要么

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

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

© www.soinside.com 2019 - 2024. All rights reserved.