Coredata 谓词 IN 运算符与 like 或 contain



我有两个数组,我必须在上面进行通配符搜索,我正在使用 IN 运算符,但 IN 运算符给了我完全匹配,但我想获取包含 searchTerm 的所有结果。这是否可以通过 IN 运算符,或者我是否必须手动遍历所有记录并匹配选择我想要的记录。

当前代码 :

        NSArray *filteredArray = [brandsFabric filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self.color_name IN  %@ OR self.subcategory_name IN %@",colorNamesArray,patternNamesArray]];

所需的功能如下所示:

        NSArray *filteredArray = [brandsFabric filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self.color_name IN like/contains %@ OR self.subcategory_name IN like/contains %@",colorNamesArray,patternNamesArray]];

这是一个非常昂贵的操作,但您可以尝试:

NSMutableArray *predicates = [NSMutableArray array];
for (NSString *name in colorNames) {
   [predicates addObject:[NSPredicate predicateWithFormat:
       @"color_name CONTAINS[cd] %@", name]];
}
for (NSString *name in subcategoryNames) {
   [predicates addObject:[NSPredicate predicateWithFormat:
       @"subcategory_name CONTAINS[cd] %@", name]];
}
NSPredicate *final = [NSCompoundPredicate orPredicateWithSubpredicates:predicates];

也许这里甚至有一个子查询。(实验性)

[NSPredicate predicateWithFormat:
  @"((SUBQUERY(%@, $x, color_name CONTAINS[cd] $x).@count != 0) OR "
  @"((SUBQUERY(%@, $x, category_name CONTAINS[cd] $x).@count != 0)", 
  colorNames, categoryNames];

它是这样的:CONTAINS[cd] %@代替IN

最新更新