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 一起使用它会返回错误:用于查询: 我简化了问题并打开了悬赏以解决CKError。【参考方案3】:

一种完全不同的方法是创建名为“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 的值

核心数据和 NSPredicate

NSPredicate 用于评估字符串

Jet/ACE 是不是使用带有 LIKE BeginsWith 查询的索引?

NSPredicate 和 NSArray