尝试程序化的sqlite数据库修复

时间:2012-10-19 18:41:58

标签: android sqlite

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

  

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

     

E /数据库(1217):   sqlite3_open_v2(“/ data / data / com.myapp / databases / mydata.db”,& handle,   6,NULL)失败

     

W / dalvikvm(1217):例外   Landroid /数据库/源码/ SQLiteException;初始化时抛出   LCOM / MyApp的/数据库/提供SQLHelper;

     

D / AndroidRuntime(1217):关闭   VM

     

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

这是权限问题吗?

2 个答案:

答案 0 :(得分:0)

.dump状态下的sqlite docs(http://www.sqlite.org/sqlite.html)

使用“.dump”命令将数据库的全部内容转换为单个ASCII文本文件。通过将其传回sqlite3,可以将此文件转换回数据库。

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

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

答案 1 :(得分:0)

似乎避免数据库损坏的最佳方法是在数据库处于已知工作状态时定期拍摄快照。有一天,当数据库无法打开时,您可以使用此方法恢复它... Backup and restore SQLite database to sdcard