2017-02-27 3 views
0

にレルムトランザクションを処理するために、私はこのようなパターンを見てきましたか? 「workWithRealmData()」関数が例外をスローした場合、トランザクションはキャンセルされません。しかし、私たちはとにかく試練の最後に、レルムを閉鎖しています。どのようにそこのサンプルコードのいくつかの部分ではAndroidの

より安全な構造は次のようになります。

try (Realm realm = Realm.getDefaultInstance()) { 
    realm.beginTransaction(); 
    try { 
    workWithRealmData(); 
    realm.commitTransaction(); 
    } finally { 
    if (realm.isInTransaction()) { 
     realm.cancelTransaction(); 
    } 
    } 
} 

安全に見えること - だけでなく、すべてのcallsitesをコードするとかなり厄介になります。

本当にこれが沸騰します。レルムがすぐ後で閉じられるかどうかは、cancelTransactionを無視するのが安全ですか?そうでない場合、何がうまくいかないでしょうか?

+0

その直後にレルムを閉じると、 'cancelTransaction'を無視しても安全です。しかし、あなたが1つの場所を欠場するとスレッドをブロックするので、私には少し安全ではないと感じます。 –

+0

偉大な - 確認のために、クリスチャンありがとう! – tmtrademark

答えて

1

executeTransaction(Realm.Transaction)エラーの場合に自動的に同期トランザクションをキャンセルする方法を使用できます。

try(Realm r = Realm.getDefaultInstance()) { 
    r.executeTransaction((realm) -> { 
     workWithRealmData(); 
    }); 
} 
+0

これは良い提案です - ありがとう!私は、元のコードサンプルの動作についてはまだ不思議です。私が理解しているように、あなたが提案するサンプルには、新しい匿名クラスを作成することが含まれています - そして、Realmを嘲笑することはできません(私は最後に見ました)ので、ユニットテストフレームワークで動作するのはやや苦労します。 – tmtrademark

+0

2.2.2ではすべてのRealmクラスをnon-finalにしていますので、今度はMockitoを使ってすべてのクラスをモックできます。 –

+0

'executeTransaction'のソースコードをチェックすると、上に表示されたものとほとんど同じです。 – EpicPandaForce

関連する問題