例如,如果我有这段代码:
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。
我只是无法弄清楚如果存在可能发生错误的风险,您将有多大机会使用 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;
}
最佳答案
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()
后就不再发生了,但那是不久前。
关于android - 为什么/何时使用 realm.beginTransaction?由于有executeTransaction和executeTransactionAsync,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39747849/