虽然这个问题已经有好几年了,但我只是偶然发现了同样的问题并像这样解决了它:
NSArray *values = @[@"FOO", @"bar" ,@"lorem"];
NSString *predicate;
predicate = @"value LIKE[cd] '";
predicate = [predicate stringByAppendingString:
[values componentsJoinedByString:
@"' OR value LIKE[cd] '"]];
predicate = [predicate stringByAppendingString:@"'"];
NSLog(@"%@", predicate);
// Output:
// value LIKE[cd] 'FOO' OR value LIKE[cd] 'bar' OR value LIKE[cd] 'lorem'
这会从值列表中创建一个静态谓词表达式。也许它对某人有用。
更新 2:
实际上,下面的更新解决方案似乎不适用于 sqlite 并产生
'NSInvalidArgumentException',
reason: 'unimplemented SQL generation for predicate : ... (bad LHS)'
我认为对于数组/字典/集合比较,IN
运算符左侧只允许使用键。
更新:
在对表达式和谓词进行一些研究之后,我发现了另一种方法,它似乎工作得很好:
NSPredicate *predicate =
[NSPredicate predicateWithFormat:
@"lowercase(value) IN %@", values];
这使用函数表达式lowercase:
来获取值的小写表示。剩下要做的就是确保 的所有条目values
都是小写的,并且您将能够使用不区分大小写的IN
表达式。