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:

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?

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.) 
  • Patrón de bloqueo de múltiples hilos de SQLiteDatabase
  • Android SQLiteException: Error al cambiar la configuración regional de db a 'en_US'
  • SQLite Android no puede abrir el archivo de base de datos
  • Android: java.lang.IllegalStateException: base de datos xxx.db (conn # 0) ya cerrado
  • Cómo obtener una fila específica donde se actualiza el valor en android
  • Insertar valores en la base de datos SQLite manualmente
  • Almacenamiento en caché de los datos descargados de JSON en la base de datos SQLite - ¿es una buena idea?
  • Evitar duplicar la entrada en la base de datos sqllite android
  • Mostrar el contenido de la base de datos sqlite en formato pdf en android
  • SQLiteException cerca de "<" mientras se borra la consulta
  • Obtener actualizaciones de contar las filas de SQLite en Android mediante una consulta en bruto?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.