Android SQLiteException: Error al cambiar la configuración regional de db a 'en_US'

Recientemente he actualizado una de mis aplicaciones Android (de código abierto) y mis usuarios reciben una excepción que no puedo replicar. Las partes clave son:

android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5)

y entonces

Caused by: android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db' to 'en_US'.

Esto ocurre en dispositivos con Android 2.3 – 4.2.1, y en varios lugares dentro de la aplicación donde intento conectarme a una base de datos. Estoy cerrando la base de datos después de usarla.

No puedo encontrar mucha información sobre la excepción "falló cambiar la configuración regional para db". Cuando miro el origen de SQLiteConnection (línea 386) , parece ser un problema con la tabla 'android_metadata' o 'actualizar los índices con una nueva configuración regional'.

Aquí está el código que está causando la excepción (en Github).

 java.lang.RuntimeException: An error occured while executing doInBackground() at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137) at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:352) at java.util.concurrent.FutureTask.setException(FutureTask.java:219) at java.util.concurrent.FutureTask.run(FutureTask.java:239) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1080) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:573) at java.lang.Thread.run(Thread.java:856) Caused by: android.database.sqlite.SQLiteException: Failed to change locale for db '/data/data/com.airlocksoftware.hackernews/databases/hacker_news_cache.db' to 'en_US'. at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:386) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218) at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:193) at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:463) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:185) at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:177) at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:804) at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:789) at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:694) at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:854) at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:229) at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224) at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164) at com.airlocksoftware.database.DbInterface.(DbInterface.java:28) at com.airlocksoftware.hackernews.loader.StoryLoader.loadStories(StoryLoader.java:62) at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:54) at com.airlocksoftware.hackernews.loader.StoryLoader.loadInBackground(StoryLoader.java:1) at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:240) at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51) at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40) at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123) at java.util.concurrent.FutureTask.run(FutureTask.java:234) ... 3 more Caused by: android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5) at android.database.sqlite.SQLiteConnection.nativeExecute(Native Method) at android.database.sqlite.SQLiteConnection.execute(SQLiteConnection.java:548) at android.database.sqlite.SQLiteConnection.setLocaleFromConfiguration(SQLiteConnection.java:364) ... 24 more 

Esto no responde totalmente a la pregunta, pero puede que también desee comprobar este artículo, y ver si tal vez puede trabajar esto en su DbHelperSingleton , ya que parece ser el mismo error que enfrentan:

Error al cambiar la configuración regional de db '/data/data/my.easymedi.controller/databases/EasyMediInfo.db' a 'en_US'

Compruebe el contenido de su base de datos, especialmente 'android_metadata'. Es una tabla con este DDL:

 CREATE TABLE android_metadata ( locale TEXT ); 

Que debe contener al menos un registro con este contenido:

 en_US 

Esto resolvió mi propio problema.

para más detalles:
Abra su archivo de base de datos con un editor sqlite como SQLiteStudio y luego abra la tabla android_metadata (si no existe, creela .) (Puede crearla con el editor de consultas (herramientas> abrir el editor de consultas) y copiar / pegar el código DDL anterior)

Para insertar el registro puede copiar / pegar esta línea en el editor de consultas:

 insert into android_metadata values ('en_us'); 

Sugerencia: para ejecutar la consulta en SQLiteStudio debe presionar el botón con focos En la barra de herramientas.

La clave es android.database.sqlite.SQLiteDatabaseLockedException .

Tuve el mismo problema, y ​​siguió aumentando con el aumento de la base de datos de bloqueo.

¿Qué hacer? – Eliminar el bloqueo de la base de datos.

¿Cómo? – Asegúrese de que no se producen llamadas de escritura simultáneas y

Puede leer más sobre cómo evitar el bloqueo de bases de datos aquí y en esta muy bien explicada respuesta .

Yo sugeriría cambiar todas sus llamadas de escritura en un solo hilo, de esta manera evitando el bloqueo. Puede utilizar AsyncQueryHandler para esto.

Si está cambiando la configuración regional en la aplicación, asegúrese de cambiarla antes de abrir la base de datos.

Estaba teniendo este mismo problema en mi aplicación cuando estaba cambiando el entorno local después de abrir mi base de datos, y estaba tratando de cambiar a una base de datos diferente basada en la configuración regional, que no existía.

  • ¿Es realmente necesario crear tablas SQLite cada vez que se inicia la aplicación?
  • Ejemplo de Android SQLite
  • Abra / cierre correctamente una base de datos con el patrón de diseño Singleton
  • Archivo DB en carpeta de activos. ¿Se actualizará?
  • Cómo insertar a granel en sqlite en android
  • Conexión de SQLite se filtró aunque todo se cerró
  • SQLiteOpenHelper vs ContentProvider
  • Cursor finalizado sin cerrar antes () Android
  • SQLiteOpenHelper "onCreate" no se llama? (El DB no existe)
  • Cómo funciona SQLiteOpenHelper Context
  • Intenta reabrir un objeto ya cerrado: sqlitequery
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.