将componentsseparatedbystring添加到包含核心数据的谓词中

时间:2015-03-25 13:39:43

标签: ios iphone core-data nspredicate nsfetchedresultscontroller

我有一个存储在Entity(核心数据)中的String我想使用NSFetchedResultsController来获取数据。

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

我想只获得至少包含该字符串中ID的实体。

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

如果可以在谓词中添加类似“componentsseparatedbystring”的内容,那么我可以给我打电话,这样我就可以在结果中迭代并使用“in”,或者如果还有其他解决方案,谢谢。

3 个答案:

答案 0 :(得分:1)

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

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

模式(^|.*,)TERM(,.*|$)搜索前面的TERM 通过字符串的开头或逗号,然后是 字符串的结尾或另一个逗号。

答案 1 :(得分:0)

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

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

然后在你的提取中使用IN谓词:

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

这假设您的数据库列名为“ID”,并且以逗号分隔的ID字符串是stringOfIds。

答案 2 :(得分:0)

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

  1. 字符串格式= a
  2. 字符串格式= a,..
  3. string format = ..,a
  4. string format = ..,a,..
  5. 所以谓词可能是:

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

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