例如,如果我有这段代码:
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>
如果存在可能发生错误的风险,我只是不知道您将使用beginTransaction
和commitTransaction
的可能性。有人executeTransaction
和executeTransactionAsync
可以很好地处理它。特别是对于executeTransactionAsync
,我猜大多数人会使用executeTransactionAsync
,因为它有onSuccess
和onError
。
对我来说,我只能想到一个原因:我想做一个简单的数据更新,仍然使用相同的线程。在这种情况下,我将使用:
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;
}
答案 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”的情况下你不能 - 你不能对上面的层说错误是发生了。