使用Realm持久化对象(错误:更改Realm数据只能在事务内部完成) [英] Persisting objects with Realm (error: Changing Realm data can only be done from inside a transaction)

查看:135
本文介绍了使用Realm持久化对象(错误:更改Realm数据只能在事务内部完成)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我很难让Realm正常工作.

I am having difficulties getting Realm to work.

RealmConfiguration realmConfig = new RealmConfiguration.Builder(this).build();
Realm.setDefaultConfiguration(realmConfig);
Realm realm = Realm.getDefaultInstance();

MyObjectExtendingRealmObject myObject = new MyObjectExtendingRealmObject("John");
realm.beginTransaction();
realm.copyToRealm(myObject);
realm.commitTransaction();

错误:java.lang.IllegalStateException:更改领域数据只能在事务内部完成

Error: java.lang.IllegalStateException: Changing Realm data can only be done from inside a transaction

让我发疯,但是我不是在事务内部进行数据持久化吗,这正是在文档中完成的方式吗?在此处查看使用copyToRealm的示例: https://realm.io/docs/java/latest/#creating-objects

Call me crazy but aren't I doing the data persistence inside the transaction, which is exactly how it's done in the docs? See the example using copyToRealm here: https://realm.io/docs/java/latest/#creating-objects

我在做什么错了?

什么,Realm不支持自动递增主键ID?给我带来破坏力.我会留这个问题,以防它对其他人有所帮助.

What, Realm doesn't support autoincrementing primary key ids? Dealbreaker for me. I'll leave this question up in case it helps others though.

我的课程

public class MyObjectExtendingRealmObject extends RealmObject {
    private String name;

    public MyObjectExtendingRealmObject() {

    }

    public MyObjectExtendingRealmObject(String name) {
        this.name = name;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

}

推荐答案

我可以看到两个可能的原因:

There are two possible reasons I can see for this:

1.)您实际上是在多个地方调用Realm.getDefaultInstance(),因此对实际上未设置在事务中的Realm实例进行了修改

1.) you're actually calling Realm.getDefaultInstance() in multiple places and thus tinkering with a Realm instance that wasn't actually set to be in a transaction

2.)您在领域对象上没有默认的空构造函数

2.) you don't have a default empty constructor on your realm object

这是一些规范的用法示例:

Here is some canonical usage example:

  • UI线程:

.

Realm realm;

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    realm = Realm.getDefaultInstance();
    realm.executeTransactionAsync(new Realm.Transaction() {
        public void execute(Realm realm) {
            MyObjectExtendingRealmObject myObject = new MyObjectExtendingRealmObject("John");
            realm.insertOrUpdate(myObject); // could be copyToRealmOrUpdate
        }
    });
}

@Override
public void onDestroy() {
    super.onDestroy();
    if(realm != null) { // don't trust old devices
        realm.close();
    }
}

  • 后台线程:
  • .

    Realm realm = null;
    try {
       realm = Realm.getDefaultInstance();
       realm.executeTransaction(new Realm.Transaction() {
           @Override
           public void execute(Realm realm) {
                MyObjectExtendingRealmObject myObject = new MyObjectExtendingRealmObject("John");
                realm.insertOrUpdate(myObject); // could be copyToRealmOrUpdate
           }
       });
    } finally {
        if(realm != null) {
            realm.close();
        }
    }
    


    领域模型:


    Realm model:

    public class MyObjectExtendingRealmObject extends RealmObject {
       public MyObjectExtendingRealmObject() { // needed
       }
    
       public MyObjectExtendingRealmObject(String name) {
           this.name = name;
       }
    
       @PrimaryKey
       private String name;
    
       public String getName() {
           return name;
       }
    
       public void setName(String name) {
           this.name = name;
       }
    }
    

    这篇关于使用Realm持久化对象(错误:更改Realm数据只能在事务内部完成)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆