En las últimas dos semanas, sin lanzar una actualización de mi aplicación, comencé a recibir un montón de informes con bases de datos corruptas. A continuación se muestra la stacktrace. Android no puede abrir la base de datos, y tampoco el programa sqlite-manager en mi computadora. Sin embargo, el administrador SQLite-addon para firefox podría abrirlo. Después de ejecutar el comando "base de datos compacta", se corrigió la base de datos y pude abrirla en Android. ¿Hay alguna manera de que pueda hacer algo como esto dentro de mi aplicación? El gran problema es que ni siquiera puedo intentar abrir la base de datos, porque las versiones más recientes de Android eliminarán y reemplazarán la base de datos de inmediato, como se puede ver en la pila siguiente. ¿Pueden las sentencias PRAGMA ejecutarse de alguna manera sin abrir la base de datos?Base de datos de Android corrupta, pero puede abrirse en SQLite Manager. ¿Recuperable?
Saludos,
02-22 09:55:20.245: ERROR/Database(5382): CREATE TABLE android_metadata failed
02-22 09:55:20.245: ERROR/Database(5382): Failed to setLocale() when constructing, closing the database
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
02-22 09:55:20.245: ERROR/Database(5382): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
02-22 09:55:20.245: ERROR/Database(5382): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
02-22 09:55:20.245: ERROR/Database(5382): Deleting and re-creating corrupt database /mnt/sdcard/myapp/backup.sqlite
02-22 09:55:20.245: ERROR/Database(5382): android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.native_setLocale(Native Method)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.setLocale(SQLiteDatabase.java:1950)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.<init>(SQLiteDatabase.java:1818)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:817)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:851)
02-22 09:55:20.245: ERROR/Database(5382): at android.database.sqlite.SQLiteDatabase.openOrCreateDatabase(SQLiteDatabase.java:844)
02-22 09:55:20.245: ERROR/Database(5382): at android.app.ContextImpl.openOrCreateDatabase(ContextImpl.java:540)
02-22 09:55:20.245: ERROR/Database(5382): at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:203)
Edit: gerente para abrir la base de datos de la siguiente manera:
db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Pero cuando corro esto:
String sqlQuery = "pragma integrity_check";
db.execSQL(sqlQuery);
me sale esto:
ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check
Edit2: Me he dado cuenta de que pasar la aspiradora de la base de datos soluciona el problema. Pero si aspiro desde mi aplicación, con exeSQL ("vacío"), no ayuda. ¿Por qué es esto? : '(
¡Gracias, eso parece bastante interesante! – pgsandstrom
@Nicolas Raoul ¿Podría explicar cómo SQLJet resolvería el problema del OP/lo evitaría? Tengo curiosidad, ya que estoy teniendo los mismos problemas que el OP :) – AgentKnopf
SQLite simplemente no tiene este error –