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:
- ANDROID SQLite SELECT x AS _id
- Cómo deshabilitar el botón Borrar datos en Información de aplicación de la aplicación Administrar
- Creación de tablas en la base de datos sqlite en android
- Cómo escribir una base de datos en un archivo de texto en android
- Mantenga el elemento de lista highlite con SimpleCursorAdapter
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.
- RawQuery: enlace o índice de columna fuera de rango
- Cómo agregar fecha en la base de datos sqlite
- Cómo personalizar FTS tokenizer en Android
- Java.sql.SQLException: No se puede ejecutar insert stmt en objeto
- ¿Cómo puedo extraer la base de datos sqlite desde el dispositivo Android?
- Cambiar la profundidad de bits de Bitmap
- ¿Cuántas filas puedo insertar en una tabla en SQLite Android?
- Cursor.moveToNext () devuelve false mientras Cursor.getCount () dice que son más de 1 fila
¿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!
- Iconos de AccountAuthenticator
- ¿Cuál es la forma correcta de validar google concedido tokens OAuth en un servidor node.js?