使用Realm保留对象(错误:更改Realm数据只能在事务内部完成)

时间:2016-09-23 02:42:57

标签: java android database transactions realm

我很难让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?对我来说是违规的。我会留下这个问题,以防它帮助其他人。

编辑:我的班级

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

}

2 个答案:

答案 0 :(得分:2)

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

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

2。)你的领域对象上没有默认的空构造函数

以下是一些规范用法示例:

  • 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();
    }
}

领域模型:

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

答案 1 :(得分:0)

我有一个名为RealmHelper的辅助类,上面是它的一个方法。

 public static void saveObject(RealmObject objectToSave) {

    Realm realm = getRealm();
    realm.beginTransaction();
    realm.copyToRealmOrUpdate(objectToSave);
    realm.commitTransaction();
}

因此,我的代码结构就是这样,没有领域的方法或对象不应该在活动或片段中。

为了克服这个错误,每次我创建具有相同id的新对象时,realm都可以覆盖旧对象。