Запрос таблицы в приложении для iPhone
-
05-07-2019 - |
Вопрос
У меня есть tableview (связанный с базой данных) и строка поиска.Когда я набираю что-либо в строке поиска, я выполняю быстрый поиск в базе данных и отображаю результаты по мере ввода.
Запрос выглядит следующим образом:
SELECT * FROM MyTable WHERE name LIKE '%NAME%'
Все работает нормально, пока я использую только символы ASCII.Что я хочу, так это ввести символы ASCII и сопоставить их эквивалент с диакритическими знаками.Например, если я наберу "Alizee", я бы ожидал, что оно будет соответствовать "Alizée".
Есть ли способ сделать запрос нечувствительным к локали?Я упоминал о опции СОРТИРОВКИ в SQL, но, похоже, она бесполезна с SQLite.Я также отметил, что iPhone SDK 3.0 имеет "Локализованную сортировку", но я не смог найти никакой документации о том, что это означает...
Спасибо.
Решение
Есть несколько вариантов решения этой проблемы:
Замена всех символов с ударением в запросе перед его выполнением, например
"Psychédélices" => "Psychedelices"
"À contre-courant" => "A contre-courant"
"Tempête" => "Tempete"
и т.д.но это работает только для входных данных, поэтому у вас не должно быть символов с ударением в самой базе данных.Простое решение, но далекое от совершенства.
Используя стороннюю библиотеку, а именно ICU (ссылки ниже).Хотя не уверен, что это лучший выбор для iPhone.
Написание одной или нескольких пользовательских функций C, которые будут выполнять сравнение.Подробнее по ссылкам ниже.
Несколько сообщений здесь, в StackOverflow, в которых обсуждаются различные варианты:
Как отсортировать текст в sqlite3 с указанной локализацией?
Сортировка строк UTF-8 без учета регистра для SQLite (C / C ++)
Как реализовать поиск без учета ударения / диакритики в Sqlite?
Также пара внешних ссылок:
Поддержка SQLite и native UNICODE LIKE в C / C ++
поиск в sqlite без учета регистра и ударения
Другие советы
Я не уверен насчёт SQL, но думаю, что вы определенно можете использовать NSDiacriticInsensitivePredicateOption
для сравнения строк NSS в памяти. Р>
Примером может служить NSArray, полный строк, которые вы ищете. Вы можете просто перебрать массив, сравнивая строки, используя NSDiacriticInsensitivePredicateOption
в качестве параметра сравнения и отображая успешные совпадения.