Autocompletar de Android con SQLite LIKE funciona parcialmente
Tengo una mesa de Restaurants
en mi base de datos SQLite que tienen los siguientes registros
| Name | Latin_Name | +--------+------------+ | Манаки | Manaki | +--------+------------+ | Енрико | Enriko | +---------------------+
Ahora estoy haciendo la búsqueda como esta:
- Sincronizar datos SQLite desde el teléfono Android a la base de datos MySQL de MySQL de Windows
- SQLite en Android: insertWithOnConflict () devuelve resultados cada vez mayores para los mismos conjuntos de datos
- Db-shm y db-wal en bases de datos sqlite
- No se pudo recuperar datos de la base de datos a listview.
- Cómo leer la base de datos de otra aplicación
De mi fragmento:
String selection = DBHelper.COL_NAME + " LIKE ? OR " + DBHelper.COL_LATIN_NAME + " LIKE ?"; String[] selectionArgs = {"%"+term+"%", "%"+term+"%"}; CursorLoader loader = new CursorLoader(getActivity(), DatabaseContentProvider.REST_CONTENT_URI, columns, selection, selectionArgs, null);
El método de query
proveedor de contenido:
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { db = dbHelper.getReadableDatabase(); SQLiteQueryBuilder builder = new SQLiteQueryBuilder(); switch(URI_MATCHER.match(uri)){ case REST_LIST: builder.setTables(DBHelper.REST_TABLE); break; case REST_ID: builder.appendWhere(DBHelper.COL_ID + " = " + uri.getLastPathSegment()); break; default: throw new IllegalArgumentException("Unsupported URI: " + uri); } Cursor cursor = builder.query(db, projection, selection, selectionArgs, null, null, sortOrder); cursor.setNotificationUri(getContext().getContentResolver(), uri); return cursor; }
Así que muy básico ¿no? Ahora viene el problema:
Si el term
que viene es en
puedo ver los restaurantes de Enriko entre los otros.
Si paso enri
no puedo ver el Enriko como resultado ya.
Lo mismo pasa con el restaurante Manaki que puedo ver hasta mana
y después de eso (para manak
término para ex) no puedo verlo en la lista de resultados.
Estaba depurando mi ContentProvider y me di cuenta de que el cursor estaba vacío, por lo que el problema tiene que ser a nivel de base de datos, supongo.
Por favor ayuda.
ACTUALIZAR:
Teniendo los comentarios @laalto en mente decidí hacer alguna prueba en la base de datos. En el método onCreate()
de mi SQLiteOpenHelper
sólo esos dos registros en la tabla a mano y funcionó.
Ahora el problema es que tengo que insertar 1300 registros onCreate()
de un archivo json
enviado en la carpeta de assets
. En este momento estoy analizando el archivo json
crear un ArrayList<Restaurant>
luego lo lazo a través de él e insertar un registro por objeto para todos los 1300 elementos.
Ese tipo de inserción no funcionará con el método SQLite LIKE
.
¿Hay algún problema con este tipo de población de la base de datos?
Tal vez tengo que cambiar la codificación de archivos (es UTF-8 ahora) o tal vez la colación de la base de datos, o tal vez getString()
de JSONObject
puede ser ajustado para la base de datos?
- Cómo almacenar JSON en SQLite
- Android SQL Lite no crece
- Cómo obtener entradas nulas de sqlite en android
- Almacenamiento en caché de datos para aplicaciones móviles de iOS / Android para trabajar con Pagination
- SQLiteException no se captura
- Uso del patrón de diseño Singleton para SQLiteDatabase
- Conexión de SQLite se filtró aunque todo se cerró
- SQLiteDiskIOException: error de E / S de disco al crear base de datos
Si es urgente, aquí una solución rápida y sucia.
2.600 cadenas (1.300 cyrillic + 1.300 latin) son realmente pocos valores para manejar en la memoria: simplemente puede cargar todos los valores desde el SQLite con
select name, latin_name from restaurants
Y luego puede enlazar el conjunto de resultados en Java mientras busca la cadena correspondiente con un método String.contains . Sólo recuerda que el método contains es sensible a mayúsculas y minúsculas, así que deberías usar algo como esto:
string1.toLowerCase().contains(string2.toLowerCase())
Enlace de documentación sqlite
The LIKE operator does a pattern matching comparison. The operand to the right of the LIKE operator contains the pattern and the left hand operand contains the string to match against the pattern. A percent symbol ("%") in the LIKE pattern matches any sequence of zero or more characters in the string. An underscore ("_") in the LIKE pattern matches any single character in the string. Any other character matches itself or its lower/upper case equivalent (ie case-insensitive matching). (A bug: SQLite only understands upper/lower case for ASCII characters by default. The LIKE operator is case sensitive by default for unicode characters that are beyond the ASCII range. For example, the expression 'a' LIKE 'A' is TRUE but 'æ' LIKE 'Æ' is FALSE.)
- Cómo romper una actividad de Android en varios archivos
- UnsupportedOperationException AudioEffect: operación de parámetro no válida