Вопрос

У меня есть tableview (связанный с базой данных) и строка поиска.Когда я набираю что-либо в строке поиска, я выполняю быстрый поиск в базе данных и отображаю результаты по мере ввода.

Запрос выглядит следующим образом:

SELECT * FROM MyTable WHERE name LIKE '%NAME%'

Все работает нормально, пока я использую только символы ASCII.Что я хочу, так это ввести символы ASCII и сопоставить их эквивалент с диакритическими знаками.Например, если я наберу "Alizee", я бы ожидал, что оно будет соответствовать "Alizée".

Есть ли способ сделать запрос нечувствительным к локали?Я упоминал о опции СОРТИРОВКИ в SQL, но, похоже, она бесполезна с SQLite.Я также отметил, что iPhone SDK 3.0 имеет "Локализованную сортировку", но я не смог найти никакой документации о том, что это означает...

Спасибо.

Это было полезно?

Решение

Есть несколько вариантов решения этой проблемы:

  1. Замена всех символов с ударением в запросе перед его выполнением, например

    "Psychédélices" => "Psychedelices"
    "À contre-courant" => "A contre-courant"
    "Tempête" => "Tempete"
    и т.д.

    но это работает только для входных данных, поэтому у вас не должно быть символов с ударением в самой базе данных.Простое решение, но далекое от совершенства.

  2. Используя стороннюю библиотеку, а именно ICU (ссылки ниже).Хотя не уверен, что это лучший выбор для iPhone.

  3. Написание одной или нескольких пользовательских функций C, которые будут выполнять сравнение.Подробнее по ссылкам ниже.

Несколько сообщений здесь, в StackOverflow, в которых обсуждаются различные варианты:
Как отсортировать текст в sqlite3 с указанной локализацией?
Сортировка строк UTF-8 без учета регистра для SQLite (C / C ++)
Как реализовать поиск без учета ударения / диакритики в Sqlite?

Также пара внешних ссылок:
Поддержка SQLite и native UNICODE LIKE в C / C ++
поиск в sqlite без учета регистра и ударения

Другие советы

Я не уверен насчёт SQL, но думаю, что вы определенно можете использовать NSDiacriticInsensitivePredicateOption для сравнения строк NSS в памяти.

Примером может служить NSArray, полный строк, которые вы ищете. Вы можете просто перебрать массив, сравнивая строки, используя NSDiacriticInsensitivePredicateOption в качестве параметра сравнения и отображая успешные совпадения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top