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):VMをシャットダウンします

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

DB の破損を回避する最善の方法は、既知の動作状態にあるデータベースのスナップショットを定期的に作成することです。ある日、DB を開くことができない場合、この方法を使用して復元します... SQLite データベースのバックアップと SD カードへの復元

于 2013-07-02T22:21:00.863 に答える
0

.dump 状態に関する sqlite ドキュメント (http://www.sqlite.org/sqlite.html)

「.dump」コマンドを使用して、データベースの内容全体を 1 つの ASCII テキスト ファイルに変換します。このファイルは、パイプを使用して sqlite3 に戻すことにより、データベースに戻すことができます。

そのため、データベースを復元するには、パイプを sqlite3 に戻す必要があります

アプリでこれを行う必要がある場合は、Runtime().getRuntime().exec 呼び出しを介して実行できる場合があります。

于 2012-11-02T14:39:55.847 に答える