2015-05-15 54 views
12

我有以下類創建嵌套對象的副本:Android的境界copyToRealmOrUpdate

public class Note extends RealmObject { 

    @PrimaryKey 
    private String id; 

    private Template template; 

    // other primitive fields, getters & setters 
} 

public class Template extends RealmObject { 

    private String name; 

    private String color; 

    // other primitive fields, getters & setters 
} 

我從通過改造& GSON後端得到我的數據,所以我必須在響應準備使用的Java對象。

讓我們想象一下,每次我調用它時,後端都會返回相同的三個Notes。 當我注意的對象列表,我做到以下幾點:

private void fetchNotesAndSave() { 
    List<Notes> notes = getNotesViaRetrofit();   

    Realm realm = Realm.getInstance(mContext); 
    realm.beginTransaction(); 
    realm.copyToRealmOrUpdate(notes); 
    realm.commitTransaction(); 
    realm.close(); 
} 

之後,我把這些線檢查的存儲對象計數:

int notesCount = mRealm.where(Note.class).findAll().size(); 
int templatesCount = mRealm.where(Template.class).findAll().size(); 

第一次:

notesCount == 3; 
templatesCount == 3; 

沒錯。但是,如果我再次調用服務器,獲得相同的音符(相同的PrimaryKey IDS),並調用fetchNotesAndSave()再次,我會得到這些結果:

notesCount == 3; 
templatesCount == 6; 

每次我打電話copyToRealmOrUpdate(),嵌套的對象,那些與primaryKey對象內部重複 - 沒有更新。

有什麼方法可以改變這種行爲嗎? 如果您需要更多信息,請讓我知道。提前致謝!

回答

13

這是因爲你的模板類沒有任何主鍵。在這種情況下,將再次插入這些對象,因爲不能保證可以更新所引用的模板對象,即使它們是具有主鍵的另一個對象的一部分。

如果您將@PrimaryKey添加到您的模板類,它應該按照您的預期工作。

+1

我明白,但在我的情況下,有很多嵌套類,我不能爲他們每個人生成'@ PrimaryKey'。例如,我使用這個技巧來處理Strings的列表https://github.com/realm/realm-java/issues/575,所以我應該爲每個'RealmString'生成'@ PrimaryKey'。這將是真正的地獄...... –

+2

有沒有任何解決方法,以保持與超類沒有「@ PrimaryKey」嵌套類一對一的關係,所以他們正確更新? –

+0

目前沒有。你將不得不手動進行清理。 –

2

如果您無法按建議提供PK,則可能需要使用以下解決方法以避免重複。

for (Note note: notes) { 
    realm.where(Note.class) 
    .equalTo("id", note.getId()) 
    .findFirst() 
    .getTemplate() 
    .deleteFromRealm(); 
} 
realm.copyToRealmOrUpdate(notes); 
+0

這是在這裏討論https://github.com/realm/realm-java/issues/2918#issuecomment-222950343 – EpicPandaForce