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:
- Agregue otra columna a su tabla, por ejemplo
MOVIE_NAME_ASCII
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}]", "");
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.