2017-07-27 64 views
0

TL; DR:我們正在尋找在Realm中實現「版本化」對象的模式,因此可以快速訪問「最後」版本(僅通過主鍵)並創建「歷史」版本從「最後」版本開始更新很容易,以及訪問該對象的所有舊版本。Realm版本化對象

一些背景。

我們正在實施的境界作爲的SQLite的Android應用程序,並在iOS應用中的替代品「從頭開始」。我們對這兩個應用程序都有一個統一的後端,並且希望在各平臺之間保持Realm對象表示儘可能接近。

SQLite中,我們有2代表與結構基本相同,爲每一個對象的最後一個版本,第二個 - 所有先前版本。在更新「主」表之前,我們將要更新的行復制到「歷史記錄」表中,然後進行更新。

+0

聽起來像的東西,_might_使用[境界功能]是可能的(https://realm.io/docs/realm-object-server/#realm-functions)。你看過那裏嗎? –

+1

@AviWarner這些是領域對象服務器功能,我們沒有使用它們。 – saabeilin

回答

0

韋爾普,我能想到的唯一的選擇是

有2代表與結構基本相同,爲每一個對象的最後一個版本,第二個 - 所有先前版本。

關鍵的區別在於歷史記錄表沒有主鍵(或者是通過將原始主鍵與版本號拼接而構成的)。

public class Dog extends RealmObject { 
    @PrimaryKey 
    private String dogId; 

    @Index 
    private String dogName; 

    private int version; 
} 

public class DogHistory extends RealmObject { 
    private String dogId; // decide if primary key from dogId+version is needed 

    @Index 
    private String dogName; 

    private int version; 
} 

然後映射它們。

DogHistory dogHistory = new DogHistory(); 
dogHistory.setDogId(currentDog.getDogId()); 
dogHistory.setDogName(currentDog.getDogName()); 
dogHistory.setVersion(currentDog.getVersion()); 
realm.insert(dogHistory); //not "insertOrUpdate" if no PK field 

棘手的事情是,你只能夠看到他們爲「同一個對象」,如果你通過接口暴露getter/setter方法。或者你映射回Dog,但它會成爲一個非託管實例,然後。

+0

我不知道如何繼承和多態領域的工作,但在以下方向思考: '''類DogData { ... } Dog類擴展DogData {...} 類DogHistory擴展DogData {...} ''' 這裏'DogData'認爲有意義的領域,而子類中的主鍵方面基本相同。 – saabeilin

+0

如果您使用的是RealmObject類不能擴展任何東西,你特別不能繼承RealmObjects之間的領域。因此,爲什麼我說映射比在共享接口中公開所有getter/setter更容易(儘管之前我必須這樣做並且工作正常) – EpicPandaForce