2017-07-27 111 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