transact statements queries commands android sqlite diacritics

statements - Cómo ignorar el acento en la consulta SQLite(Android)



sqlite3 statements (3)

Soy nuevo en Android y estoy trabajando en una consulta en SQLite. Mi problema es que cuando uso el acento en cadenas, por ejemplo

  • ÁÁÁ
  • ááá
  • ÀÀÀ
  • ààà
  • aaa
  • AAA

Si lo hago:

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

Es vuelta

  • AAA
  • aaa (está ignorando a los demás)

Pero si lo hago:

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

Es vuelta

  • ààà (ignorando el título "ÀÀÀ")

Quiero seleccionar cadenas en una base de datos SQLite sin cuidar los acentos y el caso. Por favor ayuda.


Debes mirarlos, no como caracteres acentuados, sino como personajes completamente diferentes. Puede que estés buscando a, b, o c. Dicho esto, intentaría usar una expresión regular para ello. Se vería algo así como:

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


En general, las comparaciones de cadenas en SQL se controlan mediante reglas COLLATE columna o expresión. En Android, solo tres secuencias de intercalación están pre-defined : BINARIA (predeterminada), LOCALIZADA y UNICODE. Ninguno de ellos es ideal para su caso de uso, y la API de C para instalar nuevas funciones de intercalación desafortunadamente no está expuesta en la API de Java.

Para evitar esto:

  1. Agregue otra columna a su tabla, por ejemplo MOVIE_NAME_ASCII
  2. Almacene los valores en esta columna con las marcas de acento eliminadas. Puede eliminar los acentos normalizando sus cadenas a la Forma D normal de Unicode (NFD) y eliminando los puntos de código que no son ASCII, ya que NFD representa caracteres acentuados aproximadamente como ASCII + simples que combinan marcadores de acento:

    String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD) .replaceAll("[^//p{ASCII}]", "");

  3. Realice sus búsquedas de texto en esta columna ASCII normalizada, pero muestre los datos de la columna original de Unicode.


Puede usar el NDK de Android para volver a compilar la fuente SQLite, incluida la ICU (International Components for Unicode) deseada. Explicado en ruso aquí: http://habrahabr.ru/post/122408/

El proceso de compilación de SQLilte con fuente con ICU se explica aquí:

¿Cómo compilar sqlite con UCI?

Desafortunadamente, terminarás con diferentes APKs para diferentes CPUs.