Запрос таблицы в приложении iPhone - PullRequest
2 голосов
/ 17 июня 2009

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

Запрос выглядит так:

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

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

Есть ли способ сделать запрос нечувствительным к локали? У меня красный вопрос об опции COLLATE в SQL, но, похоже, он бесполезен с SQLite. Я также отметил, что iPhone SDK 3.0 имеет «Локализованное сопоставление», но я не смог найти никакой документации о том, что это значит. .

Спасибо.

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

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

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

    "Психоделики" => "Психоделики"
    "À contre-courant" => "A contre-courant"
    "Tempête" => "Tempete"
    и т.д.

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

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

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

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

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

0 голосов
/ 17 июня 2009

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

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

...