NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配
Posted
技术标签:
【中文标题】NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配【英文标题】:NSPredicate and BEGINSWITH with CloudKit : Field value type mismatch 【发布时间】:2014-11-07 00:54:17 【问题描述】:我有一个表“存储”,其属性“名称”为字符串类型(检查索引以进行排序查询和搜索)。 我想执行类似 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">
【问题讨论】:
【参考方案1】:我猜你需要去掉“ANY”。
ANY 和 SOME 聚合运算符可以与 IN 和 包含运算符以执行列表成员资格测试。
所以 ANY 用于列表(数组)。由于'name'是一个String,它不是一个列表,因此不匹配错误:“字段'name'的查询谓词中的字段值类型不匹配”
【讨论】:
好的,谢谢,但是如何执行查询以查找所有以“子字符串”开头的“名称”或“类别”的商店? @John 我不确定你是否可以直接这样做。您可以按照另一个答案的建议尝试全文搜索,或者您可以创建一个字符串数组的新字段。然后您可以使用 ANY:“ANY searchableFields BEGINSWITH %@”,其中 searchableFields 是记录中的一个新字段,它是一个包含两个元素的数组:名称和类别。【参考方案2】:大胆猜测...尝试:
[NSPredicate predicateWithFormat:@"ANY 'name','category' BEGINSWITH %@",substring];
这可能是键/值的错误反转,但它可能会起作用。
【讨论】:
它对你有用吗?因为我有这个错误:***由于未捕获的异常'CKException'而终止应用程序,原因:'意外表达式:ANY “name”,“category” BEGINSWITH“mysubstring”' 如果我使用 [NSPredicate predicateWithFormat:@"ANY name BEGINSWITH 'mysubstring'"] 它不会返回 performQuery 错误但没有记录,如果我将它与 CKQueryOperation 一起使用它会返回错误:一种完全不同的方法是创建名为“nameAndCategory”的第三个字段,附加两个字符串并将它们添加到该字段中。然后弄清楚如何使用谓词进行全文搜索(标记化字符串搜索):
[NSPredicate predicateWithFormat:@"self contains '%@'",substring];
或
[NSPredicate predicateWithFormat:[NSString stringWithFormat:@"self contains '%@'",substring];
但也许唯一确定的方法是进行两次搜索并合并结果。
【讨论】:
我简化了问题并打开了悬赏以解决CKError。以上是关于NSPredicate 和 BEGINSWITH with CloudKit:字段值类型不匹配的主要内容,如果未能解决你的问题,请参考以下文章
Core Data 使用类似于 BEGINSWITH 的东西为 NSNumber 创建 NSPredicate
NSPredicate 通过选择带有 Beginswith 的键来获取 NSDictionary 的值