【问题标题】:How to partially update a realm object如何部分更新领域对象
【发布时间】:2016-08-22 10:05:49
【问题描述】:

如何部分更新领域对象?

想象一下我有一个这样的模型:

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

假设我将本地领域数据库与后端同步,而后端仅给我一个 Person 和 id 和 name,其中名称已更改(无地址)。

如何仅更新 Person.name ?此外,我希望Person.address 保留在本地数据库中。

【问题讨论】:

  • 您必须手动完成。在Realm上查询id,更新启动事务更新你从服务器获取的值并提交
  • 真的没有别的办法了吗?听起来很痛苦......
  • 我以前见过这个问题,Realm 团队的一个人在这里回答了这个问题。我现在找不到链接,但你可以重新搜索它。是的,很痛苦。如果有一个带有空检查的update 方法,那就太好了。
  • @Budius 从技术上讲,您应该开始交易,在 Realm 上查询 id。更新你得到的值然后提交。 (或在失败的情况下取消)
  • 如果您使用Realm.createOrUpdateAllFromJson()(和其他与JSON相关的API),它将忽略JSON对象中不存在的字段。这意味着如果对象不存在,该字段将设置为默认值,如果存在具有相同主键的对象,则保留原始值。

标签: java android realm


【解决方案1】:

您只能插入/复制/更新整个对象,不能指定“您不想保存哪些字段”。因此,您应该查询您的对象并设置其内容,然后将其保存回来。

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);
    }
});

【讨论】:

  • 我们不应该在最后一行做if(!person.isManaged()) realm.insertOrUpdate(person); 吗?因为如果是托管的话,地址已经直接在person.address = address改了。
【解决方案2】:

要更新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();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多