2011-02-22 6 views
14

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? : '(

Respuesta

1

La canónica buena manera de recuperar una base de datos corrupta es para volcar hacia fuera como SQL y luego leerlo de nuevo a una nueva base de datos Está muerto fácil con la herramienta de SQLite:.

sqlite in.db .dump | sqlite out.db 

. ... pero, por supuesto, necesitas hacerlo en código, y realmente no sé si .dump está disponible desde cualquier lugar.

Sugiero que posiblemente quieras ver cómo se corrompe. en primer lugar --- SQLite siempre ha sido sólido para mí, aunque solo lo he usado en el almacenamiento interno. ¿Puedes verificar el sistema de archivos FAT para ver si está dañado? He visto, e. g., cámaras digitales que manipularán completamente el sistema de archivos en las tarjetas de varias formas oscuras ...

0

¿En su aplicación cierra la base de datos antes de salir de la actividad? Mire el logcat y verifique si hay errores o advertencias cuando ejecuta su aplicación.

1

Android eliminando la base de datos es un issue de hecho.

Acabo de darme cuenta de que una solución podría ser usar SQLJet en lugar de la implementación predeterminada de Android SQLite.
Como su nombre no sugiere, SQLJet es un cliente de SQLite Java de código abierto, y funciona en Android.

+0

¡Gracias, eso parece bastante interesante! – pgsandstrom

+0

@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

+0

SQLite simplemente no tiene este error –

Cuestiones relacionadas