2011-02-18 19 views
35

Mi aplicación Android incluye una base de datos SQLite con una clase SQLiteOpenHelper para ayudar a administrarla. Durante el uso de la aplicación, el usuario puede realizar algunas operaciones como agregar/eliminar/actualizar, etc. en la base de datos.¿Cuándo debería hacer ciertas operaciones SQLite en otro hilo (no en el hilo principal)?

En algunos puntos se conoce el tamaño de la operación, así:

  1. usuario hace clic en el botón para guardar el elemento
  2. la SQLiteDatabase realiza una sola insert consulta
  3. usuario continúa utilizando aplicación

En otras áreas de la aplicación, la operación puede ser grande, como insertar más de 10 elementos en la base de datos a la vez.

Preguntas:

  • debo enhebrar operaciones simples como insertar/actualizar/borrar/viendo 1 del producto?
  • ¿llevará más tiempo insertar 1 elemento en una tabla que contiene muchos elementos (como 30+) de los que llevaría insertar en una tabla sin elementos?
  • si no necesito enhebrar operaciones tan simples, ¿en qué punto sugiere iniciar enhebrarlas?

cuando digo hilo quiero decir usando un hilo que no es el principal hilo de interfaz de usuario.

editar: Me doy cuenta de que las operaciones pequeñas no toman mucho tiempo y podría hacerlo bien en el hilo principal. Me preocupa que sea una mala práctica ejecutarlos en el hilo principal y me gustaría una aclaración.

Respuesta

39

Regla general para todo: si es lo suficientemente rápido, hágalo en el hilo principal. Si no, use un hilo de trabajo.

A menos que tenga una base de datos ridículamente grande, una sola operación casi nunca garantiza un hilo separado. Las bases de datos en general están diseñadas para escalar bien, pero, por supuesto, una base de datos muy grande (¿más de 10.000 filas?) Será un poco más lenta que una pequeña. 30 filas, sin embargo, no es nada.

Empezaría a enrutar cosas si tiene muchas operaciones en marcha, como un montón de consultas o consultas complicadas que abarcan varias tablas.

Como con todo: crea un perfil de tu aplicación, y si es demasiado lenta, optimiza. No escriba un estupendo manejador de bases de datos sincronizados super-duper multi-core listo si ninguna de sus consultas lleva más de 2 ms.

+13

¿Qué pasa con la conversación sobre las aplicaciones de cliente REST de Android en Google IO. Él dice "nunca ejecute las operaciones de la base de datos en el contexto del hilo principal". Espero no sacar eso del contexto, pero puede ser una buena práctica. – zidarsk8

+5

Todavía estoy de acuerdo con la última frase: no optimices lo que no es lento. Si su base de datos es muy pequeña, no debería ser necesario optimizarla. Agregar varios subprocesos aumentará mucho la complejidad de su aplicación e introducirá un fascinante caldo de cultivo para los errores de sincronización que son imposibles de detectar y depurar. – EboMike

+3

Utilice los cargadores, ahora están disponibles como parte de la biblioteca de compatibilidad. – zzzzzzzzzzzzzzzzzzzzzzzzzzzzzz

2

Absolutamente no hay razón para usar un hilo aquí. Simplemente devuelva el cursor, extraiga la información del cursor y regrésela a la actividad principal.

Hablando específicamente, un hilo es algo ideal que va a repetirse hasta que algo pase o se agote. Dado que la base de datos que está utilizando supongo que está en el teléfono, tomaría prácticamente cero tiempo para acceder a ella.

También otra cosa que puede hacer es crear una clase de utilidad para ayudar con su actividad a la interacción con la base de datos.Sería lo que su actividad llama para interactuar con la base de datos. En concreto, el flujo de control sería así:

Actividad -> Utilidad -> Base de datos

Su entre la actividad y la base de datos para mantenerlos aislados unos de otros y hacer que sea mucho más fácil acceder a todo lo que necesita ya no tiene que ir directamente a la base de datos en sí.

+0

Un hilo es útil para hacer algo en paralelo a otro hilo. Es una buena idea usar un hilo separado cuando no se garantiza que volverá rápidamente, lo que es el caso con cualquier cosa que acceda al disco, ya que otro hilo/proceso/aplicación podría causar contención del disco. El acceso de SQLite es pesado en disco. –

6

Mida siempre antes de optimizar!

Asegúrate de que las operaciones DB afectan la experiencia del usuario y que comienzas a buscar una solución.

Si las cosas de la base de datos se vuelven lentas, utilice AsyncTask, que fue diseñado para realizar tareas en segundo plano, y luego actualice la GUI en EDT.

+0

Incluso el uso de Loader podría hacerse en lugar de AsyncTask. Tiene muchas ventajas para abordar la carga de datos fuera de la cadena de interfaz de usuario. [enlace] (http://developer.android.com/reference/android/content/Loader.html) – Tejas

Cuestiones relacionadas