2016-08-22 13 views
4

レルムオブジェクトを部分的に更新するにはどうすればよいですか?レルムオブジェクトを部分的に更新する方法

class Person { 
    @PrimaryKey long id; 
    String name; 
    Address address; 
} 

のは、私はバックエンドと私の地元のレルムデータベースを同期して、バックエンドは、名前が変更されたidnameでのみPerson私に与えますと仮定しましょう(アドレスなし:

することは、私は、このようなモデルを持っている想像してみて)。

Person.nameのみを更新するにはどうすればよいですか?さらに、Person.addressはローカルデータベースにそのまま残したい。

+1

手動で行う必要があります。レルム上の 'id'を照会し、開始トランザクションを更新します。サーバーから得た値を更新してコミットします – Budius

+0

本当に他の方法はありませんか?痛みを伴う... – sockeqwe

+1

私はこの質問を前に強要しました。そして、レルムチームの1人の男がここに答えました。私は今、リンクを見つけることができませんが、あなたはそれを検索することができます。うん、それは痛いです。ヌルチェック付きの 'update'メソッドがあれば素晴らしいでしょう。 – Budius

答えて

1

Person.nameを更新するには、最初にPersonオブジェクトを照会してからnameを更新する必要があります。 「何を保存したくないフィールド」あなたが指定することはできません、//

long id = ... // from backend 
String newName = ... // from backend 
Realm realm = Realm.getDefaultInstance(); 
realm.beginTransaction(); 
Person person = realm.where(Person.class).equalTo("id", id).findFirst(); 
person.setName(newName); 
realm.commitTransaction(); 
realm.close(); 
2

あなたが唯一の挿入することができますコピーオブジェクト全体を更新します。他のすべてのフィールドは変更されません。だからあなたはあなたのオブジェクトを照会し、その物をセットし、それを元に戻すべきです。

final Address address = getAddress(); 
realm.executeTransaction(new Realm.Transaction() { 
    @Override 
    public void execute(Realm realm) { 
     Person person = realm.where(Person.class).equalTo(PersonFields.ID, id).findFirst(); 
     if(person == null) { 
      person = new Person(); // or realm.createObject(Person.class, id); 
      person.id = id; 
     } 
     person.address = address; 
     realm.insertOrUpdate(person); 
    } 
}); 
関連する問題