我发现当用户从手机中取出电池时,应用程序的数据库可能会损坏。这导致:
I/Database(1217): sqlite returned: error code = 14, msg = cannot open file at source line 25467
E/Database(1217): sqlite3_open_v2("/data/data/com.myapp/databases/mydata.db", &handle, 6, NULL) failed
W/dalvikvm(1217): Exception Landroid/database/sqlite/SQLiteException; thrown while initializing Lcom/myapp/database/SQLhelper;
D/AndroidRuntime(1217): Shutting down VM
W/dalvikvm(1217): threadid=1: thread exiting with uncaught exception (group=0x40015560)
前提
我读到过使用 .dump 可以恢复有用的数据。所以我采取了以下方法......
执行
final String strDBpath = Application.getContext().getDatabasePath(DB_NAME).getAbsolutePath();
final File fDBsrc = new File(strDBpath);
final File fDBtrgt = new File(strDBpath.replace(".db", "new.db"));
final String strExeCmd = "sqlite3 "+fDBsrc+" .dump | sqlite3 "+fDBtrgt;
boolean bSuccess = true;
try
{
Log.i(TAG, "executing "+strExeCmd);
Process process = Runtime.getRuntime().exec(strExeCmd);
process.waitFor();
} catch (Exception er)
{
bSuccess = false;
}
结果 但是 - 列出/data/data/com.myapp/databases 并没有显示新的数据库。
这是权限问题吗?
最佳答案
关于 .dump 状态的 sqlite 文档 (http://www.sqlite.org/sqlite.html)
使用“.dump”命令将数据库的全部内容转换为单个 ASCII 文本文件。该文件可以通过管道返回到 sqlite3 中转换回数据库。
因此您需要通过管道返回到 sqlite3 以恢复数据库
如果您需要在您的应用程序中执行此操作,您可以通过 Runtime().getRuntime().exec 调用来执行此操作
关于android - 尝试以编程方式修复 sqlite 数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12980482/