0

エラー処理をより明確で読みやすくすることは可能ですか?私のバージョンは少しかさばるようです:

public synchronized void doSomeTrans(...) throws Exception {
    Exception ex = null;
    SQLiteDatabase db = null;
    boolean bTrans = false;

    try {
        db = getWritableDatabase();

        db.beginTransaction();
        bTrans = true;

        db.execSQL(...);
        db.execSQL(...);

        db.setTransactionSuccessful();
    }
    catch (Exception ex1) {
        ex = ex1;
    }

    if (db != null) {
        if (bTrans != false)
            db.endTransaction();

        db.close();
    }

    if (ex != null)
        throw ex;
}

また、私のバージョンでは、endTransactionメソッドに関するエラー処理はありません。このメソッドが例外をスローした場合でも、データベースは開いたままです。それは良くないと思いますが、try/catchブロックに新しいものを追加することがこの場合の最良の解決策であるかどうかはわかりません。

4

1 に答える 1

2

他に何もない場合は、を使用する必要がありますfinally。とにかく例外をさらにスローしているので、わざわざキャッチしないでください。

try {
    db = getWritableDatabase();
    ...
} finally {
    if (db != null) {
        if (bTrans != false)
            db.endTransaction();
        db.close();
    }
}

もう 1 つのことは、1 つの操作のためにデータベースを開いて再度閉じるべきではないということです。これはSLOWであるためです。またはdbの少なくとも有効期間は周りにある必要があります。外側の/ペアを取り除くので、次のようになります。ActivityServicegetWritableDatabase()close

db.beginTransaction();
try {
    db.execSQL(...);
    db.execSQL(...);

    db.setTransactionSuccessful();
} finally {
    db.endTransaction();
}

簡単に発生する可能性のあるendTransactionifスローには到達していないことに注意してください。beginTransaction私は通常 C API を使用しているため、Android ラッパーについてはわかりませんが、C API はデータベースのロックを待機せず、データベースが別のトランザクションによって既にロックされているとすぐに失敗します。

明らかに RAII またはコンテキスト マネージャーはさらに短くなりますが、残念ながら Java にはどちらもありません (更新: Java 8 にはありますがtry(variable)、Android は Java 6 のままです。ただし、そのターゲットに対しても Kotlin でサポートする必要があります)。

于 2012-08-03T11:10:31.923 に答える