pgs*_*rom 14 database sqlite android pragma corruption
在最近的两周内,在没有发布我的应用程序更新的情况下,我开始收到一堆包含损坏数据库的报告.下面是堆栈跟踪.Android无法打开数据库,我的计算机上的sqlite-manager程序也无法打开.但是,fireite的SQLite manager-addon可以打开它.运行命令"compact database"后,数据库已修复,我可以在android中打开它.有什么方法可以在我的应用程序中做这样的事情吗?最大的问题是我甚至无法尝试打开数据库,因为较新版本的Android会立即删除并替换数据库,如下面的堆栈跟踪中所示.可以在不打开数据库的情况下以某种方式执行PRAGMA语句吗?
问候,
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)
Run Code Online (Sandbox Code Playgroud)
编辑:我经理打开这样的数据库:
db = SQLiteDatabase.openDatabase(database, null, SQLiteDatabase.NO_LOCALIZED_COLLATORS);
Run Code Online (Sandbox Code Playgroud)
但当我运行这个:
String sqlQuery = "pragma integrity_check";
db.execSQL(sqlQuery);
Run Code Online (Sandbox Code Playgroud)
我明白了:
ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check
Run Code Online (Sandbox Code Playgroud)
Edit2:我已经意识到抽真空数据库可以解决这个问题.但是,如果我从我的应用程序内部使用exeSQL("真空")吸尘,它无济于事.为什么是这样?:'(
恢复损坏数据库的规范好方法是将其转储为 SQL,然后将其读回新数据库。使用 sqlite 工具非常简单:
sqlite in.db .dump | sqlite out.db
Run Code Online (Sandbox Code Playgroud)
...但是,当然,您需要在代码中执行此操作,而且我真的不知道 .dump 是否可以从任何地方获得。
我建议您可能首先要了解一下它是如何被损坏的 --- SQLite 对我来说一直坚如磐石,尽管我只在内部存储上使用过它。您可以检查 FAT 文件系统是否已损坏吗?例如,我见过数码相机会以各种晦涩的方式彻底破坏卡上的文件系统......
| 归档时间: |
|
| 查看次数: |
6007 次 |
| 最近记录: |