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

标签 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。

我只是无法弄清楚如果存在可能发生错误的风险,您将有多大机会使用 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;
}

最佳答案

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/

相关文章:

android - 在外部存储API 23上创建新目录

android - 无法从您的 Ionic 应用生成 Android App Bundle(没有 Android Studio)

android - 无法关闭与 Activity 连接的 ViewModel 中的 Realm 实例

ios - 复合主键域/swift

android - 错误 :(27, 5) 找不到与给定名称匹配的资源(在 'android:textColor' 处,值为 '@color/link_text_material_light')

android - 处理 Kotlin Coroutines 中自定义 okhttp 拦截器引发的异常

android - 当我们有 ViewModels 时,我们还需要 onSaveInstanceState() 吗?

ios - 新应用程序安装时会调用新 Realm 迁移

android - 如何在Android应用程序中同步服务器数据?

android - Kotlin Realm : Class must declare a public constructor with no arguments if it contains custom constructors