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.) 
  • Modo offline de la aplicación android, sincronización local de la base de datos sqlite con la base de datos distante
  • Android OrmLite base de datos pre-poblar
  • ¿Un cursor SQLite vacío devolverá true para isBeforeFirst, isAfterLast, ambos o ninguno?
  • ¿Es posible obtener acceso de sólo lectura a una base de datos sqlite en un apk?
  • Devuelve el recuento de registros en una variable, Sqlite, Android, Java
  • Pasar los datos a otro fragmento de vista de desplazamiento con la pestaña de estudio de Android, no botón
  • No se ha podido abrir la base de datos de georreferencias de vista web de Android
  • Insertar TimeStamp en SQLite para Android
  • Intento escribir una base de datos readonly ... pero no estoy
  • SQLiteException "no puede confirmar - ninguna transacción está activa" al insertar con CONFLICT_REPLACE
  • Determinar el tipo de datos de una columna en SQLite
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.