2010-03-07 9 views
16

Estoy desarrollando una aplicación de Android. Tiene múltiples hilos que leen y escriben en la base de datos SQLite de Android. Estoy recibiendo el siguiente error:Cómo evitar los errores de bloqueo de SQLiteException

SQLiteException: error code 5: database is locked

entiendo la SQLite bloquea toda la db en la inserción/actualización, pero estos errores sólo se parecen suceder al insertar/actualizar mientras estoy ejecutando una consulta de selección. La consulta de selección devuelve un cursor que se deja bastante abierto (unos segundos algunas veces) mientras lo recorro. Si la consulta de selección no se está ejecutando, nunca obtengo los bloqueos. Me sorprende que el select pueda bloquear el db. ¿Es esto posible o está sucediendo algo más?

¿Cuál es la mejor manera de evitar dichos bloqueos?

+0

Usted dice dejando el cursor abierto por un tiempo. Creo que tengo el mismo problema, pero mis cursores están siendo mantenidos por ListView. ¿Alguna vez lograste arreglar esto? – taer

+1

Sí, lo arreglé leyendo el contenido del cursor inmediatamente en una colección, cierro el cursor y luego se itera sobre la colección para hacer el trabajo que consume mucho tiempo. Si está utilizando listView, debería poder hacer lo mismo y usar un ArrayAdapter o escribir su propio adaptador extendiendo ArrayAdapter. – TheArchedOne

+0

http://stackoverflow.com/questions/7657223/sqlite-exception-database-is-locked-issue/9503044#9503044 – junto

Respuesta

2

Evitando dejar los cursores abiertos durante "bastante tiempo". Si puede permitirse tener todos sus datos en la memoria de una vez, entonces hágalo.

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

1

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

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

7

Probablemente esté abriendo y cerrando conexiones de bases de datos múltiples en sus diversos hilos. Esta es una mala idea. Simplemente abra una conexión de base de datos única y vuelva a utilizarla en cualquier lugar; SQLite se asegurará de que los accesos simultáneos se serialicen correctamente.

Al igual que con la respuesta de jcwenger, el uso de ContentProvider es otra forma de lograr esto, pero requerirá cambios mucho más intrusivos en su código.

+0

No abro ni cierro la base de datos varias veces, aunque obtengo este error, por favor, tome una mira [el enlace está aquí] (http://stackoverflow.com/questions/13859840/application-crashes-on-installation-with-error-sqlite3-exec-failed-to-set-sync) – MobileEvangelist

0

Su causada por beginTransaction() function.Look a su código, el problema se resuelve para mi aplicación para hacer una línea de comentario esta función (beginTransaction)

línea
Cuestiones relacionadas