2012-10-19 75 views
3

我發現當用戶從電話中拉出電池時,應用程序的數據庫可能會損壞。這導致:嘗試編程sqlite數據庫修復

I /數據庫(1217):源碼返回:錯誤代碼= 14,味精=不能打開 文件在源極線25467

E /數據庫(1217): sqlite3_open_v2(」 /data/data/com.myapp/databases/mydata.db」 &手柄, 6,NULL)失敗

W/dalvikvm(1217):異常 Landroid /數據庫/源碼/ SQLiteException;拋出時初始化 Lcom/myapp/database/SQLhelper;

d/AndroidRuntime(1217):關閉 VM

W/dalvikvm(1217):線程ID = 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沒有透露新的數據庫。

這是一個權限問題?

回答

0

看來,避免數據庫損壞的最好方法是在數據庫處於已知工作狀態時定期拍攝快照。有一天,當數據庫無法打開時,你可以使用這種方法恢復它... Backup and restore SQLite database to sdcard

0

上使用.dump狀態

使用SQLite文檔(http://www.sqlite.org/sqlite.html)中的「使用.dump」命令將數據庫的全部內容轉換成一個單一的ASCII文本文件。這個文件可以通過管道回到sqlite3來轉換回數據庫。

所以你需要回水管sqlite3的恢復分貝

如果你需要做到這一點在你的應用程序您可以通過運行時要做到這一點()。getRuntime()。exec調用

+0

這就是我試過的,而.dump沒有在應用程序中工作。它在終端上工作 –

相關問題