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)
- Java - java.lang.IllegalStateException: No se pudo leer la fila 0, col -1 de CursorWindow
- Android obtener la imagen de disco de base de datos es malformado (código 11) error
- Robolectric: ejecutar múltiples pruebas falla
- "No hay un constructor por defecto disponible en android.database.sqlite.SQLitepenhelper" en Android Studio
- Insertar datos JSON en la base de datos SQLite en android
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
- SQLiteOpenHelper sincronización
- GetReadableDatabase a menudo, pero no siempre devuelve null
- AsyncTask de Android y instancia de SQLite DB
- Error al insertar android.database.sqlite.sqliteconstraintexception error código 19 restricción fallida
- SQLiteOpenHelper múltiples bases de datos en memoria
- SQLiteOpenHelper - ¿Cómo se crea la base de datos?
- El objeto de conexión de SQLite se filtró - Android
- Android no actualiza la base de datos SQLite
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 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.
- ¿Puede el color central ser reposicionado en un androide radial-gradiente dibujable?
- Javax.net.ssl.SSLException: Conexión cerrada por peer en el dispositivo 4.4.2 (funciona en 6.0.1)