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

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

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()就停止发生的神秘问题,但那是一段时间之前.

上一篇:关于mysql的wait_timeout参数 设置不生效的问题【转】


下一篇:java – Realm android,似乎没有应用RealmTransformer