2

トランザクションを使用していてSQL操作が失敗した場合、すべての変更がロールバックされることはわかっていますが、finallyステートメントの後ですべてのコードを停止しますか、それとも残りは実行し続けますか?

以下のコードのようなものは正しく見えますか、それともcatchステートメントを使用する必要がありますか?また、テスト目的でエラーをシミュレートすることは可能ですか?

public static boolean updateSuccessful = false;

updateToVersion2();
//Does anything after here still run on error?

if(!updateSuccessful) {
    deleteAndRecreateDatabase();
}


public void updateToDbVersion2() {
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } finally {
        this.myDataBase.endTransaction();
    }
}
4

3 に答える 3

1

例外をキャッチする必要があります!なぜそれを省略したのか、コードの臭いが悪くなります...

execSQLとの間で実際に例外が発生し、最終的にトランザクションを終了する部分にsetTransactionSuccessful該当する場合はどうなりますか?finally

コードは次のようになります。

public void updateToDbVersion2() {
    boolean fubar = false;
    this.myDataBase.beginTransaction();
    try {
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue1' WHERE _id = 1");
        this.myDataBase.execSQL("UPDATE myRecords SET column = 'newValue2' WHERE _id = 2");
        this.myDataBase.setTransactionSuccessful();
        // This is not reached on update error, right?
        updateSuccessful = true;
    } catch(Exception ex){
        fubar = true;
        // Do whatever is needed to be done such as logcat FOR debugging ONLY!
    } finally {
        if (!fubar){
            // No exceptions occurred, OK to end transaction
            this.myDataBase.endTransaction();
        }
    }
}

句の条件付きチェックfinallyにより、結果として発生する可能性のある混乱を防ぎ、データの整合性を確保する方法に注意してください。

于 2012-08-10T21:55:13.640 に答える
0

一連の例外があります

http://developer.android.com/reference/android/database/SQLException.html

および Web 上の関連する例と提案

Android データベース エラー?

SQLException が SQLiteExcpetion をキャッチしないのはなぜですか?

于 2012-08-10T20:53:43.283 に答える
0

トランザクションは全体として機能します。成功するか失敗するかのどちらかです。つまり、DB 内のすべてのデータを取得するか、何も取得しないか (もちろん、このトランザクション内で) を意味します。ある時点でトランザクションが失敗した場合、最初に「catch」部分に移動し、その後「finally」に移動する必要があります。

user827992 が指摘しているように、例外をキャッチするのは興味深いことです。余分な (おそらく価値のある) 情報がそこにある可能性があります。

于 2012-08-10T21:22:41.793 に答える