Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/203.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android数据库已损坏,但可以在SQLite管理器中打开。可恢复的?_Android_Database_Sqlite_Corruption_Pragma - Fatal编程技术网

Android数据库已损坏,但可以在SQLite管理器中打开。可恢复的?

Android数据库已损坏,但可以在SQLite管理器中打开。可恢复的?,android,database,sqlite,corruption,pragma,Android,Database,Sqlite,Corruption,Pragma,在最近的两周里,在没有发布应用程序更新的情况下,我开始收到一堆数据库损坏的报告。下面是stacktrace。Android无法打开数据库,我电脑上的sqlite manager程序也无法打开。但是,firefox的SQLite管理器插件可以打开它。运行命令“compact database”后,数据库被修复,我可以在android中打开它。我有没有办法在我的应用程序中做类似的事情?最大的问题是我甚至无法尝试打开数据库,因为Android的新版本会立即删除并替换数据库,如下面的stacktrace

在最近的两周里,在没有发布应用程序更新的情况下,我开始收到一堆数据库损坏的报告。下面是stacktrace。Android无法打开数据库,我电脑上的sqlite manager程序也无法打开。但是,firefox的SQLite管理器插件可以打开它。运行命令“compact database”后,数据库被修复,我可以在android中打开它。我有没有办法在我的应用程序中做类似的事情?最大的问题是我甚至无法尝试打开数据库,因为Android的新版本会立即删除并替换数据库,如下面的stacktrace所示。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)
但当我运行这个:

String sqlQuery = "pragma integrity_check";
db.execSQL(sqlQuery);
我明白了:

ERROR/AndroidRuntime(9144): Caused by: android.database.sqlite.SQLiteDatabaseCorruptException: database disk image is malformed: pragma integrity_check

Edit2:我意识到清理数据库可以解决这个问题。但如果我用exeSQL(“真空”)从我的应用程序内部抽真空,那就没用了。这是为什么?:'(

恢复损坏数据库的标准好方法是将其作为SQL转储,然后将其读回新数据库。使用sqlite工具非常简单:

sqlite in.db .dump | sqlite out.db
…但是,当然,您需要在代码中完成,我真的不知道.dump是否在任何地方都可用


我建议您首先可能想了解它是如何被破坏的——SQLite对我来说一直是坚如磐石,尽管我只在内部存储上使用过它。您能检查FAT文件系统是否被破坏吗?我见过,例如,数码相机,它会彻底破坏v中卡上的文件系统各种模糊的方式…

在您的应用程序中,您是否在退出活动之前关闭了数据库?查看日志,检查在您运行应用程序时是否存在任何错误或警告。

Android删除数据库确实是一种错误

我刚刚意识到一个解决方案可以使用,而不是默认的Android SQLite实现。

顾名思义,SQLJet是一个开源Java SQLite客户端,在Android上工作。

谢谢,这看起来真的很有趣!@Nicolas Raoul你能解释一下,SQLJet将如何解决OP问题/防止它吗?我很好奇,因为我和OP有同样的问题:)SQLite没有这个错误SQLJet只是一个使用SQLite数据库的API。这是一个很好的方法,但最后,你不能保证数据库不会被破坏
sqlite in.db .dump | sqlite out.db