核心数据谓词IN运算符与like或contains

时间:2014-12-02 08:06:10

标签: ios objective-c core-data predicate

我有两个数组,我必须在其中进行通配符搜索,我使用的是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]];

2 个答案:

答案 0 :(得分:1)

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

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];

答案 1 :(得分:0)

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