#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
и