jjzjj

java - 使用 Realm 持久化对象(错误 : Changing Realm data can only be done from inside a transaction)

coder 2023-12-04 原文

我在使用 Realm 时遇到困难。

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:更改 Realm 数据只能从事务内部完成

说我疯了,但我不是在事务内部进行数据持久化吗,这正是文档中的做法?请参阅此处使用 copyToRealm 的示例:https://realm.io/docs/java/latest/#creating-objects

我做错了什么?

编辑:什么,Realm 不支持自动递增主键 ID?对我来说是破坏者。我会留下这个问题,以防它对其他人有帮助。

编辑:我的类(class)

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;
    }

}

最佳答案

我认为这有两个可能的原因:

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

2.) 你的 Realm 对象上没有默认的空构造函数


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

  • 界面线程:

.

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 模型:

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;
   }
}

关于java - 使用 Realm 持久化对象(错误 : Changing Realm data can only be done from inside a transaction),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39651764/

有关java - 使用 Realm 持久化对象(错误 : Changing Realm data can only be done from inside a transaction)的更多相关文章

随机推荐