Хотя этому вопросу уже несколько лет, я наткнулся на ту же проблему и решил ее так:
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)'
Я думаю, что для сравнения массивов / dict / set и IN
в левой части оператора разрешены только ключи.
UPDATE:
После некоторого исследования выражений и предикатов я обнаружил еще один подход, который, кажется, работает довольно хорошо:
NSPredicate *predicate =
[NSPredicate predicateWithFormat:
@"lowercase(value) IN %@", values];
При этом используется выражение функции lowercase:
для получения строчного представления значения. Все, что осталось сделать, - это убедиться, что все записи values
строчные, и вы сможете использовать регистрозависимые IN
выражения.