我在实体(核心数据)中存储了一个字符串,我想使用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种可能性:
- 字符串格式=a
- 字符串格式=a
- 字符串格式=。。,a
- 字符串格式=。。,a、
所以谓词可以是:
[NSPredicate predicateWithFormat:@"(ID LIKE %@ OR
ID CONTAINS %@ OR
ID CONTAINS %@ OR
ID ENDSWITH %@)",
searchedID,
[NSString stringWithFormat:@"%@,", searchedID],
[NSString stringWithFormat:@",%@", searchedID],
[NSString stringWithFormat:@",%@,", searchedID]]
但这是一个肮脏的解决方案,我真的想要更干净的。