Cómo evitar errores de bloqueo de SQLiteException

Estoy desarrollando una aplicación para Android. Tiene varios hilos que leen de y que escriben a la base de datos de SQLite del androide. Estoy recibiendo el error siguiente:

SQLiteException: código de error 5: la base de datos está bloqueada

Entiendo que el SQLite bloquea todo el db en la inserción / actualización, pero estos errores sólo parecen suceder al insertar / actualizar mientras estoy ejecutando una consulta de selección. La consulta select devuelve un cursor que se está dejando bastante abierto (algunos segundos algunas veces) mientras que iterate sobre él. Si la consulta de selección no se está ejecutando, nunca obtengo los bloqueos. Me sorprende que el select podría bloquear el db. ¿Es esto posible, o está sucediendo algo más?

¿Cuál es la mejor manera de evitar estas cerraduras?

Probablemente esté abriendo y cerrando varias conexiones de base de datos en sus varios subprocesos. Esta es una mala idea. Simplemente abra una conexión de base de datos única y vuelva a usarla en todas partes; SQLite asegurará entonces que los accesos simultáneos se serialicen correctamente.

Al igual que con la respuesta de jcwenger, usar un ContentProvider es otra manera de lograr esto, pero requerirá cambios mucho más intrusivos a su código.

Evitando dejar los cursores abiertos durante "bastante tiempo". Si puede darse el lujo de tener todos sus datos en la memoria de una vez, y luego hacerlo.

Si no puede, intente aumentar el tiempo de espera ocupado.

Migre a un ContentProvider en lugar de acceder directamente a la base de datos. ContentResolver evita todos los problemas de subprocesamiento y también permite otras funciones útiles como compartir datos entre aplicaciones o sincronizar con un servidor.

La sobrecarga de api de ContentResolver es mínima. Sólo necesita definir una cadena de AUTHORITY (Una cadena única que identifique el "tipo" de sus datos – use un tipo de cadena "com.example.myapp.contacts") y use ContentResolver.bla en lugar de db.bla.

Su causado por la función beginTransaction (). Mira tu código, el problema se resuelve para mi aplicación para hacer una línea de comentario esta función (beginTransaction) line

  • Androide sqlite comprobar si se ha insertado un nuevo valor
  • Guardar ArrayLists en bases de datos SQLite
  • ¿Es posible hacer una consulta sin procesar en la base de datos de metales de Android de meta sqlite?
  • Base de datos LocalStorage vs Sqlite
  • Android: La ventana del cursor está llena
  • Acceso a bases de datos en Android
  • SQLite en el operador en query ()
  • Android SQLite Query - Obteniendo los últimos 10 registros
  • Versión de SQLite utilizada en Android?
  • ¿Es posible usar Couch DB o MySql o cualquier otro DB en Android?
  • Marco del cargador vs AsyncTask simple
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.