android - 尝试以编程方式修复 sqlite 数据库

标签 android sqlite

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

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/

相关文章:

android - 如何解决 W/art : Could not create image space with image file '/system/framework/boot.art' while trying to port Android Lollipop on Arndale Board?

ruby - 将 Ruby 字符串插入 Sqlite

python - Django/Sqlite3 为带有外键的模型添加一行

android - 编辑 javadoc 的 css

android - fragment 中的抽屉导航和 SurfaceView

Android 自定义按钮通用点击处理程序

java - 如何在 xml 中水平并排创建 3 个具有相同空间的按钮(Android)

sqlite - 在 sqlite 数据库中插入记录不会改变它的大小,但是

sql - Sqlite3中两个日期之间的差异

php - pdo->query() 返回每个结果中的两个?