例如,如果我有这些代码:
Realm realm = Realm.getDefaultInstance();
realm.beginTransaction();
mUser.setName("Roy");
realm.commitTransaction();
textView1.setText(mUser.getName());
根据该文档,它表示如果事务内部存在错误,将捕获异常并且不会保留数据.所以在上面的代码中,假设mUser.setName中有错误(“Roy”);或者realm.commitTransaction();,不会出现崩溃,代码仍会继续?但是,在这种情况下不会调用cancelTransaction.会发生什么?更新:看起来应用程序不会崩溃,但下次如果你继续从Realm读取内容它会崩溃并告诉你Realm被锁定,因为没有调用commitTransaction.
我只是不知道如果存在可能发生错误的风险,您将使用beginTransaction和commitTransaction的可能性.有alreaday 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()就停止发生的神秘问题,但那是一段时间之前.