Saltar al contenido

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

[*]Ya no tienes que indagar más por otras páginas ya que estás al espacio indicado, tenemos la respuesta que buscas y sin complicaciones.

Solución:

[*]En general, string las comparaciones en SQL se controlan por columna o expresión COLLATE reglas. En Android, solo hay tres secuencias de intercalación predefinidas: BINARIO (predeterminado), LOCALIZADO y UNICODE. Ninguno de ellos es ideal para su caso de uso y, lamentablemente, la API de C para instalar nuevas funciones de intercalación 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 sin los acentos. Puede eliminar acentos normalizando sus cadenas a Unicode Normal Form D (NFD) y eliminando puntos de código que no sean ASCII, ya que NFD representa caracteres acentuados aproximadamente como ASCII simple + combinación de marcadores de acento:

    String asciiName = Normalizer.normalize(unicodeName, Normalizer.Form.NFD)
        .replaceAll("[^\pASCII]", "");
    
  3. [*]Realice sus búsquedas de texto en esta columna normalizada en ASCII, pero muestre los datos de la columna Unicode original.

[*]En Android sqlite, LIKE y GLOB ignorar ambos COLLATE LOCALIZED y COLLATE UNICODE (solo sirven para ORDER BY). Sin embargo, existe una solución sin tener que agregar columnas adicionales a su tabla. Como explica @asat en esta respuesta, puedes usar GLOB con un patrón que reemplazará cada letra con todas las alternativas disponibles de esa letra. En Java:

public static String addTildeOptions(String searchText) 
    return searchText.toLowerCase()
                     .replaceAll("[aáàäâã]", "\[aáàäâã\]")
                     .replaceAll("[eéèëê]", "\[eéèëê\]")
                     .replaceAll("[iíìî]", "\[iíìî\]")
                     .replaceAll("[oóòöôõ]", "\[oóòöôõ\]")
                     .replaceAll("[uúùüû]", "\[uúùüû\]")
                     .replace("*", "[*]")
                     .replace("?", "[?]");

[*]Y luego (no literalmente así, por supuesto):

SELECT * from table WHERE lower(column) GLOB "*addTildeOptions(searchText)*"

[*]De esta forma, por ejemplo en español, un usuario que busca ya sea más o más obtendrá la búsqueda convertida en metro[aáàäâã]sdevolviendo ambos resultados.

[*]Es importante notar que GLOB ignora COLLATE NOCASE, por eso convertí todo a minúsculas tanto en la función como en la consulta. Note también que el lower() La función en sqlite no funciona en caracteres que no son ASCII, ¡pero nuevamente esos son probablemente los que ya está reemplazando!

[*]La función también reemplaza a ambos GLOB comodines, * y ?con versiones “escapadas”.

Sección de Reseñas y Valoraciones

[*]Tienes la opción de añadir valor a nuestro contenido colaborando tu veteranía en las críticas.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *