将由字符串分隔的组件添加到具有核心数据的谓词中



我在实体(核心数据)中存储了一个字符串,我想使用NSFetchedResultsController来获取数据。

字符串格式:abc、ba、x、s、d。这是一个保存为字符串的ID数组。

我只想得到在该字符串中至少包含一个ID的实体。

问题是,如果我在谓词中使用CONTAIN并搜索"a",我会得到错误的结果。

请告诉我是否可以在谓词中添加类似"componentsseparatedystring"的内容,这样我就可以迭代并在结果中使用"in",或者是否有其他解决方案,谢谢。

您可以在谓词中使用"MATCHES"运算符,它执行正则表达式匹配:

NSString *searchID = @"a";
NSString *pattern = [NSString stringWithFormat:@"(^|.*,)%@(,.*|$)",
                     [NSRegularExpression escapedPatternForString:searchID]];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID MATCHES %@", pattern];

模式(^|.*,)TERM(,.*|$)搜索前面的TERM由字符串的开头或逗号,后跟字符串的末尾或另一个逗号。

首先将您的ID数组转换为NSArray:

NSArray *arrayOfIds = [stringOfIds componentsSeparatedByString:@","];

然后在提取时使用IN谓词:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ID IN %@", arrayOfIds];

这假设数据库列被称为"ID",并且ID的逗号分隔字符串是stringOfIds。

最后我将使用一个脏的解决方案:我们有4种可能性:

  1. 字符串格式=a
  2. 字符串格式=a
  3. 字符串格式=。。,a
  4. 字符串格式=。。,a、

所以谓词可以是:

[NSPredicate predicateWithFormat:@"(ID LIKE %@ OR
ID CONTAINS %@ OR
ID CONTAINS %@ OR 
ID ENDSWITH %@)",
searchedID,
[NSString stringWithFormat:@"%@,", searchedID],
[NSString stringWithFormat:@",%@", searchedID],
[NSString stringWithFormat:@",%@,", searchedID]]

但这是一个肮脏的解决方案,我真的想要更干净的。

最新更新