2017-07-27 13 views
0

TL; DR:レルムのバージョン管理されたオブジェクトを実装するパターンを探していますので、「最後の」バージョンは(主キーだけで)高速にアクセスでき、「履歴」バージョン更新前の「最後の」バージョンからのアクセスは簡単であり、オブジェクトのすべての古いバージョンへのアクセスも容易です。レルムのバージョン管理されたオブジェクト

いくつかの背景。

私たちはAndroidアプリでSQLiteの代わりにRealmを実装しており、iOSアプリでは "ゼロから"も実装しています。私たちは両方のアプリケーション用に統一されたバックエンドを持ち、プラットフォーム間でRealmオブジェクト表現を可能な限り近づけたいと考えています。

SQLiteでは、基本的に同じ構造を持つ2つのテーブルがあります.1つは各オブジェクトの最終バージョンを持ち、もう1つは以前のすべてのバージョンです。 「メイン」テーブルを更新する前に、更新するローを「ヒストリー」テーブルにコピーして更新します。以前のすべてのバージョン -

+0

[Realm Functions](https://realm.io/docs/realm-object-server/#realm-functions)を使用して_可能なようなものです。まだ見たことがありますか? –

+1

@AviWarnerこれらはレルムオブジェクトサーバの機能ですが、私たちはそれらを使用していません。 – saabeilin

答えて

0

Welp、私は考えることができる唯一のオプションは

にあるが、基本的に同じ構造で、各オブジェクトの最後のバージョンを有するもの、第二との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 

難しいのは、インタフェースを介してゲッター/セッターを公開する場合にのみ、それらを「同じオブジェクト」として見ることができるということです。または、Dogに戻してマップしますが、アンマネージインスタンスになります。

+0

私はどのようにレルムでの継承やポリモーフィズムの作品が、次の方向で考えていたことを確認していない: '' 'クラスDogData { ... } クラスの犬がDogData {...} クラスDogHistoryが伸びを拡張DogData {...} '' ' ここで' DogData'は意味のあるフィールドを保持しますが、サブクラスは基本的に主キーの点で異なります。 – saabeilin

+0

RealmObjectクラスを使用していて、特にRealmObjects間でフィールドを継承することはできません。それで、なぜ私はマッピングがすべてのgetters/setterを共有インタフェースに公開するよりも簡単だと言ったのです(私は前にそれをしなければならず作業しましたが) – EpicPandaForce

関連する問題