Usando COLLATE en Android SQLite – Locales se ignora en la instrucción LIKE

Al crear mi base de datos SQLite en Android establezco la configuración regional de la base de datos – db.setLocale (nueva configuración regional ("cz_CZ")). Esta es una localidad checa.

Una sentencia SELECT funciona y toma en cuenta la configuración regional, por ejemplo:

SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED 

Encontrará la entrada «ščťžý».

Pero el uso de LIKE fallará:

 SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED 

No se devuelve ninguna fila.

Por cierto No hay clase java.text.Normalized en Android. Pensé que podría hacer una segunda columna con un texto normalizado, despojado de caracteres especiales, que se utilizaría para la búsqueda – pero me falta una clase o forma de normalizar la cadena.

¿Ha echado un vistazo a la documentación de SQLite para LIKE ? Ha llegado información sobre caracteres no ASCII y un error. Tal vez Android tiene una versión anterior de SQLite instalado donde esto es un problema.

Creo que la segunda columna normalizada podría ser su mejor opción por desgracia.

Crear una segunda columna normalizada se puede utilizar para dar la vuelta a las limitaciones (como se menciona brevemente en otras respuestas).

Esto significa en la práctica que usted tiene que crear otra columna (sombra) de su primera donde se almacenan los mismos datos en un caso fijo (por ejemplo, todos los caracteres superiores). En esta nueva columna con los valores de búsqueda en el mismo caso pueden realizarse consultas insensibles a mayúsculas y minúsculas (incluyendo consultas similares).

Si la primera columna "a" contiene

AAA
Aaa
Bbb
Äää
Ééé

La segunda columna a_shadow contendría para las mismas filas

AAA
AAA
BBB
ÄÄÄ
ÉÉÉ

Y su consulta original (ejemplo) "seleccione una de mi tabla donde a = 'äää'"
Sería reemplazado por "select a from mytable where A = 'ÄÄÄ'"

Su código debe actualizarse para rellenar el contenido de sombra convertido al agregar el contenido principal. Si la columna se agrega después de la creación o no puede cambiar el código, es posible que sea necesario convertir los valores existentes mediante una consulta de actualización. Ejemplo:

UPDATE mytable SET a_shadow=UPPER(a);

Puede ser mucho tiempo, pero puede utilizar el java.text.Normalizer como aquí

Conversión de símbolos, letras de acento al alfabeto inglés

Como no es parte del subconjunto java que Android, puede intentar buscarlo en el código de java, como aquí: http://www.docjar.com/html/api/java/text/Normalizer.java. Html Con el Javadoc encontrado aquí: http://www.docjar.com/docs/api/java/text/Normalizer.html

Y copia la parte del código necesaria dentro de tu proyecto.

¡Espero que funcione!

  • Obtener la distancia más corta desde un punto
  • Android.database.sqlite.SQLiteException: Token no reconocido:
  • ORM en Android SQLite y esquema de base de datos
  • Cómo consultar una tabla FTS4 de contenido externo pero devolver columnas adicionales de la tabla de contenido original
  • Cómo almacenar la base de datos SQLite de Android en sdcard
  • En Android db de SQLite cómo coincidir con valores de columnas particulares que tienen id mismo en varias tablas de una base de datos?
  • ActiveAndroid: columnas de fecha no creadas
  • Establecer un valor predeterminado en una columna en SQLite
  • No se pueden actualizar varias filas en el comando de actualización de la base de datos Sqlite en android
  • DETALLES DE EXCEPCIÓN: java.lang.IllegalStateException: Proceso 3188 Cuota de cursor excedido 100, lo matará con Rom MIUI
  • Cómo contar el número de columnas en una tabla en SQLITE?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.