为什么/何时使用realm.beginTransaction?由于有executeTransaction和executeTransactionAsync

时间:2016-09-28 12:40:28

标签: android realm

例如,如果我有这段代码:

Realm realm = Realm.getDefaultInstance();

realm.beginTransaction();
mUser.setName("Roy");
realm.commitTransaction();

textView1.setText(mUser.getName());

根据该文档,它表示如果事务中存在错误,将会捕获Exception并且数据不会被保留。因此,在上面的代码中,如果mUser.setName("Roy");realm.commitTransaction();中出现问题,则不会发生崩溃并且代码仍会继续?但是,在这种情况下,cancelTransaction不会被调用。会发生什么? 更新:看起来该应用程序不会崩溃,但下次如果您继续从Realm读取内容,它将崩溃并告诉您Realm已被锁定,因为未调用commitTransaction。 / p>

如果存在可能发生错误的风险,我只是不知道您将使用beginTransactioncommitTransaction的可能性。有人executeTransactionexecuteTransactionAsync可以很好地处理它。特别是对于executeTransactionAsync,我猜大多数人会使用executeTransactionAsync,因为它有onSuccessonError

对我来说,我只能想到一个原因:我想做一个简单的数据更新,仍然使用相同的线程。在这种情况下,我将使用:

try {
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            mUser.setName("Roy");
        }
    });
} catch (Exception e) {
    Logger.e(TAG, "error", e);
    Toast.makeText(getActivity(), R.string.error_occurred, Toast.LENGTH_SHORT).show();
    return;
}

2 个答案:

答案 0 :(得分:5)

realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
       //...
    }
});

相当于

realm.beginTransaction();
try {
    //...
    realm.commitTransaction();
} catch(Throwable e) {
    if(realm.isInTransaction()) {
        realm.cancelTransaction();
    }
    throw e;
}

因此,如果您问我,begin/commit容易出错,如果没有catch { cancel.. }条款,则不应使用它。

至于在失败的情况下没有调用cancelTransaction(),我刚刚结束了一旦我开始调用cancelTransaction()就停止发生的神秘问题,但那是在不久之前。

答案 1 :(得分:1)

这就是我理解歧义的原因:

正如EpicPandaForce在案例“beginTransaction-commitTransaction”中所说,你可以捕获异常并决定如何处理它,但在“executeTransaction”的情况下你不能 - 你不能对上面的层说错误是发生了。