2013-04-29 2 views
14

Я новичок в adnroid, и я работаю над запросом в sqlite, но проблема в том, что я использую акцент в своей строке. Пример:Как игнорировать акцент в запросе SQLite (Android)

  • aaÃ
  • aaÃ
  • aaÃ
  • aaÃ
  • ааа
  • AAA

Если я:

SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%a%' ORDER BY MOVIE_NAME; 

Это возвращение:

  • AAA
  • ааа (Это не обращая внимания на других)

Но если я:

SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%à%' ORDER BY MOVIE_NAME; 

возвращение Это:

  • aaà (игнорируя заголовок «ÀÀÀ»)

Я хочу выбрать строки в SQLite DB без ухода за акцентами и футляром. Пожалуйста помоги.

+0

Возможный дубликат [Акцентированный поиск в sqlite (android)] (http://stackoverflow.com/questions/14083446/accented-search-in-sqlite-android) –

+1

Не дублируется вышесказанным - речь идет о правильном сопоставлении акцентированные символы (совпадение в верхнем и нижнем регистре), не игнорируя их. – laalto

ответ

28

Вообще, сравнения строк в SQL управляются столбца или выражения COLLATE правил. В Android только три последовательности сортировки: pre-defined: BINARY (по умолчанию), LOCALIZED и UNICODE. Ни один из них не идеален для вашего случая использования, и API C для установки новых функций сортировки, к сожалению, не отображается в Java API.

Чтобы обойти эту проблему:

  1. Добавить еще один столбец в таблицу, например MOVIE_NAME_ASCII
  2. хранения значений в этом столбце с диакритическими знаками удалены. Вы можете удалить акцентами нормализуя свои строки в Unicode Нормальной Форме D (NFD) и удаления не-ASCII кодовых точек, поскольку NFD представляет акцентированные символы примерно как обычный ASCII + сочетающие маркеры ударения:

    String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD) 
        .replaceAll("[^\\p{ASCII}]", ""); 
    
  3. Do ваш поиск текста на этот ASCII-нормализованный столбец, но отображает данные из исходного столбца Юникода.

+1

Работает и для меня, но Im интересно, нет ли других способов сделать это – Ektos974

0

Вам нужно посмотреть на них, а не на акцентированные символы, но как на совершенно разные символы. Вы могли бы также искать a, b или c. При этом я бы попытался использовать для этого регулярное выражение. Это будет выглядеть примерно так:

SELECT * from TB_MOVIE WHERE MOVIE_NAME REGEXP '.*[aAàÀ].*' ORDER BY MOVIE_NAME; 
+2

Есть еще много акцентов, чем это ... –

0

Вы можете использовать Android NDK для перекомпиляции источника SQLite, включая требуемый ICU (Международные компоненты для Unicode). Разъяснения в России здесь: http://habrahabr.ru/post/122408/

Процесс составления SQLilte с источника с СИС объясняется здесь:

How to compile sqlite with ICU?

К сожалению, вы будете в конечном итоге с различными APK, для разных процессоров.

Смежные вопросы