2010-09-03 9 views
5

En mi aplicación de Android, necesito obtener 50,000 entradas de la base de datos (texto) y compararlas con un valor cuando la actividad comience (en onCreate()). Estoy haciendo esto de la manera más simple: obtengo toda la tabla de db a cursor. Sin embargo, esta forma es demasiado lenta. ¿Hay otras formas de hacerlo de manera más efectiva?¿Hay alguna manera eficiente de hacer que la consulta de la base de datos de Android sea más rápida?

Editar: La aplicación es "solucionador de scrabble" es por eso que no estoy utilizando WHERE cláusula en mi consulta (Tome toda la información y compararla con la combinación de las letras de entrada). Al principio estaba usando una gran mesa que contiene palabras completas posibles. Ahora estoy usando 26 tablas. Esto redujo el retraso y estoy haciendo llamadas a la base de datos en un hilo, eso también solucionó muchos problemas. Todavía está un poco lento, pero mucho mejor.

+0

¿Qué estás comparando? ¿Cuerdas, enteros? – Bostone

+0

estoy comparando cadenas. – dirhem

Respuesta

9

para resumir y añadir un poco más

  1. Deje que la base de datos hacer el trabajo de buscar para usted, utilice una ¡Cláusula WHERE cuando realiza una consulta!
  2. Si su cláusula where no opera en la columna de clave principal o en una columna única, debe crear un índice para esa columna. Aquí hay información sobre cómo hacer eso: http://web.utk.edu/~jplyon/sqlite/SQLite_optimization_FAQ.html#indexes
  3. Google dice: "Utilice marcadores de parámetros de interrogación como 'teléfono =?' en lugar de valores explícitos en el parámetro de selección, para que las consultas que difieren solo por esos valores se reconozcan como las mismas para el almacenamiento en caché ".
  4. Ejecute el análisis de consultas utilizando EXPLAIN QUERY PLANhttp://www.sqlite.org/lang_explain.html y busque cualquier operación scan, estas son mucho más lentas que las operaciones search. Utiliza índices para evitar operaciones scan.
  5. No realice tareas que requieran mucho tiempo en onCreate(), utilice siempre un AsyncTask, un Handler ejecutándose en una cadena de fondo o en alguna otra cadena no principal.
  6. Si lo que necesita hacer búsqueda de texto completo por favor lea: http://www.sqlite.org/fts3.html
1

Utilice una cláusula WHERE en su SQL en lugar de leer todo en. A continuación, agregue un índice en las columnas en la cláusula WHERE.

1

Al menos puede poner el índice en el campo que compara y usar la cláusula WHERE. Si está comparando números, Sqlite (motor de base de datos utilizado por Android) admite funciones como MIN y MAX. Además, si está comparando cadenas parciales, puede usar LIKE. Para la optimización de consultas hay muchos recursos such as this

2

Nunca debe leer de la base de datos en el hilo de la interfaz de usuario. Use un hilo de fondo a través de AsyncTask o utilice el enhebrado regular. Esto solucionará el problema de retraso de UI que tengas.

Hacer que la base de datos se lea más rápido ayudará a que los datos sean más rápidos para el usuario, pero es aún más importante que la búsqueda de datos no impida que el usuario use la aplicación.

Mira la Enlaces Siguiendo:

Painless Threading in Android

YouTube: Writing Zippy Android Apps

Cuestiones relacionadas