¿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?
- Cómo sincronizar Android Database con un servidor SQL en línea?
- Buscando información sobre el Administrador de sincronización de Android
- Espere los datos async retrive de Firebase en android
- En Android, ¿debe ejecutarse un adaptador de sincronización de contactos en un proceso independiente?
- Mejor manera de sincronizar contactos
- Cómo agregar programaticamente una cuenta personalizada en android?
- ¿Cómo mantener sincronizados los datos de una aplicación de Android en varios dispositivos?
- Patrón de diseño recomendado para escribir en la base de datos SQLite en Android
- ¿Cómo actualizar la empresa de contacto de Android?
- Artículos de adaptador de sincronización para Android múltiples como Cuenta de Google?
- Android Studio 0.8.2 "La sincronización del proyecto Gradle falló."
- ¿Cómo manejas los registros de antememoria de caché en la aplicación para móviles
- ¿Cómo usar una clase SyncAdapter para varias autoridades?
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).
- Gradle muestra un error en la biblioteca de soporte: "La versión del módulo com.android.support:support-v13:19.0.1 depende de las bibliotecas pero no es una biblioteca en sí"
- ¿Cómo hago que la ventana de vista previa intellij android permanezca abierta?