2016-09-23 70 views
4

使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:更改域的數據只能從一個事務內部完成

叫我瘋了,但不是我做交易,這是究竟是如何內部數據持久它是在文檔中完成的?請參閱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; 
    } 

} 
+0

Autoincrementing id並不是Realm開箱即用的功能,但[它不是您在5分鐘內無法實現的功能](https:// reddit。com/r/androiddev/comments/53z2kk/which_orm_solution_should_i_choose_in_2016/d7yjy6x)或者 – EpicPandaForce

+0

順便說一句,我瘋狂的猜測是你的MyObjectExtendingRealmObject沒有默認的空構造函數,即使它應該 – EpicPandaForce

+0

@EpicPandaForce它有一個默認的空構造函數 –

回答

2

有兩個可能的原因,我可以看到這一點:

1)你實際上調用多個地方Realm.getDefaultInstance(),從而與領域實例是修修補補本來就不是設定在一個交易

2)你沒有一個默認的空構造你的境界對象


01上

下面是一些典型用法示例:

  • 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; 
    } 
} 
+0

1.我只在整個應用程序中調用過'Realm.getDefaultInstance()'(現在它只是MainActivity,我創建一個對象並嘗試持久化它)。 2.我的類有一個默認/空的構造函數。我會將它添加到OP中。 –

+0

在這種情況下,我會好奇你的確切堆棧跟蹤,以及哪一行會引發異常。領域版本1.2.0,對吧? – EpicPandaForce

+1

這是令人尷尬的。它現在工作,我不知道爲什麼。我也不認爲我改變了任何事情。無論如何,答案是好的,所以我會接受。 –

0

我有一個名爲RealmHelper和上面一個輔助類是其方法之一。

public static void saveObject(RealmObject objectToSave) { 

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

因爲這樣,我的代碼結構就是這樣,沒有領域的方法或對象不應該在活動或片段。

爲了克服這個錯誤,我每次創建具有相同id的新對象,並且領域可以覆蓋舊對象。