NSPredicate содержит строчную строчку

Я разрабатываю приложение iOS с iOS SDK 6.0 и XCode 4.5.2. Моя целевая разработка - 4.3.

Я использую Core Data для управления моими данными. Теперь у меня есть NSPredicate для поиска магазинов:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

Это объект магазина:

enter image description here

Мне нужно преобразовать имя в нижний регистр и посмотреть, содержит ли он shopSearchBar.text в нижнем регистре.

Пример:

У меня эти четыре магазина:

  • Shop1
  • магазин 1
  • мой магазин
  • Магазин

Если текст поиска пользователя является "магазином", он должен вернуть все из них.

Знаете ли вы, как это сделать?

Ответ 1

Вот как я решил свою проблему:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@",
                              shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

Ответ 2

(a) Вы можете добавить столбец в свой репозиторий - lowercaseName - и каждый раз, когда вы сохраняете магазин, сохраните только строчную версию его имени. Тогда ваш предикат просто сравним:)

(b) Однако, если все, что вам нужно, - это нечувствительное к регистру сравнение, попробуйте следующее:

if ((shopSearchBar.text != nil) && ([shopSearchBar.text length] > 0))
{
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name LIKE[cd] %@",shopSearchBar.text];
    [fetchRequest setPredicate:predicate];
}

Это также диакритическое нечувствительное сравнение. Посмотрите раздел "Сравнение строк" ​​эта страница документов для получения дополнительных параметров.

(a) дает вам более быстрые запросы, но более сложный код. (b) дает вам очень простые методы сохранения, но (немного) более медленные запросы

Ответ 3

Вы должны иметь возможность использовать предикат NSPredicatWithBlock: method:

NSPredicate *predicate = [NSPredicate predicateWithBlock:^BOOL(id obj, NSDictionary *bind) {
return [self.name compare:shopSearchBar.text options:NSCaseInsensitiveSearch] == NSOrderedSame; }];