NSPredicate, пробелы в CoreData. Как обрезать в предикате?

#objective-c #ios #sqlite #core-data #nspredicate

#objective-c #iOS #sqlite #core-данные #nspredicate

Вопрос:

У меня есть приложение CoreData / SQLite, в котором у меня есть «Родительские категории» и «Категории». У меня нет контроля над данными, некоторые значения «Родительских категорий» имеют завершающие пробелы.

Я мог бы использовать CONTAINS (или я должен сказать, что это работает, CONTAINS но это то, что я не могу использовать). Например, у меня есть 2 записи, MEN и MENS. Если я использую CONTAINS , я верну обе записи, вы можете видеть, как это может быть проблемой.

Я могу легко обрезать со своей стороны, но предикат сравнит это с базой данных и не будет совпадать. Итак, мой вопрос в том, как я могу учитывать пробелы в предикате, если это вообще возможно.

У меня есть категория «MENS», которую кто-то выбрал в приложении, и она сравнивается с «MENS» в базе данных.

Комментарии:

1. Лучший вопрос: почему данные в вашем хранилище не были очищены? Тогда у вас не было бы этой проблемы.

2. Вы можете использовать CONTAINS и предположить, что он может возвращать более 1 записи, а затем перебирать результаты выборки, проверяя ‘isEqualToString`?

Ответ №1:

Я бы обрезал данные перед выполнением поиска. Вы можете сделать это легко с помощью stringByTrimmingCharactersInSet . Сделав это заранее, вы также избежите снижения производительности. Это может быть дорого, если вы проводите сравнение на основе символов CONTAINS .

Итак, допустим, ваша строка поиска — «MEN».

Вот способ удалить любые сомнительные символы:

 NSString *trimmed = [@"MEN  " stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  

Есть также whitespaceAndNewlineCharacterSet , который делает то, что написано на tin.

Кроме того, легко создать свой собственный пользовательский символ материала, который вы хотите обрезать.

Для этого взгляните на:

Ссылка на класс NSCharacterSet

и

Руководство Apple по программированию строк