3

我发现当用户从手机中取出电池时,应用程序的数据库可能会损坏。这导致:

I/Database(1217):sqlite 返回:错误代码 = 14,msg = 无法在源代码行 25467 打开文件

E/Database(1217): sqlite3_open_v2("/data/data/com.myapp/databases/mydata.db", &handle, 6, NULL) 失败

W/dalvikvm(1217):异常 Landroid/database/sqlite/SQLiteException;初始化 Lcom/myapp/database/SQLhelper 时抛出;

D/AndroidRuntime(1217):关闭虚拟机

W/dalvikvm(1217): threadid=1: 线程以未捕获的异常退出 (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 并没有显示新的数据库。

这是权限问题吗?

4

2 回答 2

0

.dump 状态的 sqlite 文档 (http://www.sqlite.org/sqlite.html)

使用“.dump”命令将数据库的全部内容转换为单个 ASCII 文本文件。这个文件可以通过管道返回到 sqlite3 来转换回数据库。

所以你需要管道回到 sqlite3 来恢复数据库

如果您需要在您的应用程序中执行此操作,您可以通过 Runtime().getRuntime().exec 调用来执行此操作

于 2012-11-02T14:39:55.847 回答
0

似乎避免数据库损坏的最佳方法是在数据库处于已知工作状态时对其进行定期快照。有一天,当数据库无法打开时,你会使用这种方法来恢复它......备份和恢复 SQLite 数据库到 sdcard

于 2013-07-02T22:21:00.863 回答