¿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?

    One Solution collect form web for “¿Cómo sincronizar el acceso a sqlite db entre el primer plano y el proceso en segundo plano?”

    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).

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.