0

このシナリオのカスタム解像度を設定したい: 1- オフライン モードで 1 つのデバイスの realmobject の整数フィールドをインクリメントする 2- オフライン モードで別のデバイスの同じ realmobject の同じ整数フィールドをインクリメントする デフォルトのカスタム解像度は last update wins ですが、私の場合、最後の更新ではなく、ライブになった後に両方のデバイスの増分が結果に反映されるようにします。テストのためにこのコードを試しました:

Realm realm = Realm.getDefaultInstance();
            final RealmResults<Number> results= realm.where(Number.class).findAll();

            realm.executeTransaction(new Realm.Transaction() {
                @Override
                public void execute(Realm realm) {
                    int num = results.get(0).getNumber()+1;
                    results.get(0).setNumber(num);
                }
            });

Number クラスは次のようになります。

public class Number extends RealmObject {
@PrimaryKey
private String id;
private int number;

public String getId() {
    return id;
}
public void increment(){
    this.number++;
}
public void setId(String id) {
    this.id = id;
}

public int getNumber() {
    return number;
}

public void setNumber(int number) {
    this.number = number;
}

この問題は、私のアプリにとって非常に重要です。クライアント側でこれを行うことができない場合、非常に興味を持っていたレルム モバイル プラットフォームを使用できなくなります。

4

3 に答える 3

0

ドキュメントには現在、カウンターはプロトコルでサポートされているが、言語レベルではまだ公開されていないことが記載されているため、自分で実装する必要があると思います。

List最も簡単な方法は、整数 (1インクリメント、-1デクリメント)として格納し、List.sum()( https://realm.io/docs/java/2.2.1/api/io/realm/RealmList.htmlを使用することです。 #sum-java.lang.String- ) を使用して集計結果をすばやく取得します。

public class Counter extends RealmObject {
    private int count;

    public int    getCount() { return count; }
    public void   setCount(int count) { this.count = count; }
}

public class Number extends RealmObject {
    @PrimaryKey
    private String id;
    private RealmList<Counter> counters;

    public void incrementNumber(){
        Counter c = realm.createObject(Counter.class);
        c.setCount(1);
        this.getCounters().add(c);
    }

    public int getNumber() {
        // Get the aggregate result of all inc/decr
        return this.getCounters().sum("count");
    }

    public void setNumber(int number) {
        this.getCounters().deleteAllFromRealm();

        Counter c = realm.createObject(Counter.class);
        c.setCount(number);
        this.getCounters().add(c);
    }

    public String getId() { return id; }
    public void setId(String id) { this.id = id; }
    private RealmList<Counter> getCounters() { return counters; }
    private void setCounters(RealmList<Counter> counters) { this.counters = counters; }
}

```

于 2016-12-28T19:44:42.250 に答える
0

おそらく、そのようなオブジェクトに対してコマンドのリストを使用し、それらをオフラインで保持し、オンラインで同期/マージすることができます。コマンドはincrementdecrementmultiplyBy2などになります。

ドキュメントには次のように記載されています。

    Inserts in lists are ordered by time. 
    If two items are inserted at the same position, the item that was
    inserted first will end up before the other item. This means that
    if both sides append items to the end of a list they will end up in
    order of insertion time.

したがって、適用されたコマンドのリストが常に日付順に表示されます。

于 2016-12-27T21:52:52.363 に答える