¿Cómo sincronizar el acceso a sqlite db entre el primer plano y el proceso en segundo plano?

Tengo un servicio que funciona en el fondo que puede tener acceso (leer y escribir) a la base de datos sqlite. El proceso de primer plano correspondiente (aplicación principal) también puede acceder (leer y escribir) a la base de datos sqlite en mi aplicación android.

¿Cómo puedo evitar problemas relacionados con intentar acceder / guardar / leer al mismo tiempo a / desde sqlite db y cuál debería ser la forma correcta de hacerlo?

Hay dos maneras fáciles de hacer esto, la primera como ChirstopheCVB escribe: Crear un método sincronizado. Sólo se puede acceder a un método sincronizado mediante un subproceso, se bloquean otros subprocesos.

Este es el método recomendado, ya que mantiene todo el código relacionado con el acceso a DB en un solo lugar. Cuando cambie el diseño de tabla de su base de datos, no necesita buscar todo el código y realizar ajustes. Escondes los detalles de tu hilo principal.

Si desea mantener su código de db en el hilo principal, utilice semáforos. Hay soporte para eso en Java: http://developer.android.com/reference/java/util/concurrent/Semaphore.html

Un semáforo es (simplificado) un solo objeto que indica si alguien está accediendo a un recurso compartido (por ejemplo, su base de datos). Antes de acceder a la base de datos, compruebe si está permitido y si lo está, a continuación, establezca el objeto para bloquear otros. Haga su cosa y restablezca los objetos para que otros puedan intentar acceder al recurso.

Un ejemplo sencillo, suponga que tiene un subproceso A & subproceso B, y una variable global canUse.

Init: canUse = true; Thread A: while (!canUse) wait; // busy waiting, your thread is blocked canUse = false; // canUse was true, now we grab access. do our thing; canUse = true; // Others are allowed to use the resource again. 

El hilo B es igual.

Esto funciona, pero hay 2 problemas. Primero, bloquea el hilo porque está esperando que el recurso esté disponible. Hay un riesgo, porque puede que nunca esté disponible y tenga bloqueo.

El segundo problema es más severo. Imagina que tienes 3 hilos: A, B y C. C ha agarrado la cerradura y tanto A como B están esperando. Lo siguiente es posible

 A: while (!canUse) wait; B: while (!canUse) wait; C: canUse = true; A: Hooray, we can grab the resource B: Hooray, we can grab the resource A: canUse = false; B: canUse = false; 

El ejemplo anterior muestra lo importante que es comprobar la variable y cambiarla se hace de una manera atómica. En otras palabras, nada más puede suceder.

Afortunadamente, java le ofrece semáforos. No es fácil de entender al principio, pero es necesario comprender si quieres hacer lo que estás pidiendo sin utilizar métodos sincronizados (estos métodos actúan como semáforos para ti sin esfuerzo adicional de codificación).

  • Juegos de sincronización de Java: sincronizados && wait && notify
  • Couchdb en Android
  • Prácticas recomendadas para sincronizar una base de datos SQL con un servidor remoto REST en Android
  • ¿Cómo usar Git en Android?
  • Android Syncadapter no permitir que el usuario elija sincronizar o no sincronizar
  • Bases de datos de sincronización Mysql SQLite
  • ¿Se puede sincronizar un Android AsyncTask doInBackground para serializar la ejecución de la tarea?
  • ¿Cómo notificar a la actividad de llamada cuando SyncAdapter ha finalizado?
  • Reproducción de audio sincronizada en dispositivos Android distintos
  • Aplicación de Android que usa Google Calendar - Problema de sincronización
  • Recursos del adaptador de sincronización de Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.