【问题标题】:Is it possible to reuse the same RealmObject instance with different IDs to save/update multiple objects in a write transaction?是否可以重用具有不同 ID 的相同 RealmObject 实例来保存/更新写入事务中的多个对象?
【发布时间】:2015-10-01 10:56:13
【问题描述】:

目前,我们正在为要保存在 Mapper 类中的每个 RealmObject 创建一个新实例。

@Override
public Person toRealmObject(Realm realm, PersonXML businessObject) {
    Person person = new Person();
    person.setId(businessObject.getId());
    person.setName(businessObject.getName());
    return person;
}

当我们创建一个新的时,我们会将它收集到一个列表中。

@Override
public void populateRealmListWithMappedModel(Realm realm, RealmList<Person> realmList, PersonsXML personXML) {
    for(PersonXML personXML : personXML.getPersons()) {
        realmList.add(personMapper.toRealmObject(realm, personXML));
    }
}

/*next the following happens:*/
//realm.beginTransaction();
//personRepository.saveOrUpdate(realm, list);
//realm.commitTransaction();

然后我们保存列表。

@Override
public RealmList<T> saveOrUpdate(Realm realm, RealmList<T> list) {
    RealmList<T> realmList = new RealmList<T>();
    for(T t : realm.copyToRealmOrUpdate(list)) {
        realmList.add(t);
    }
    return realmList;
}

问题是,以下是否可能,我是否可以重复使用相同的 Person 对象并更改其值以指定 Realm 我想要保存的对象,但不是有与之关联的整个对象?

就像这样:

@Override
public Person toRealmObject(Realm realm, PersonXML businessObject, Person person) {
    person.setId(businessObject.getId());
    person.setName(businessObject.getName());
    return person;
}

然后

@Override
public void writeObjectsToRealm(Realm realm, PersonsXML personXML) {
    realm.beginTransaction();
    Person person = new Person();
    for(PersonXML personXML : personXML.getPersons()) {
        person = personMapper.toRealmObject(realm, personXML, person));
        personRepository.saveOrUpdate(person);
    }
    realm.closeTransaction();
}

这个方法在哪里

@Override
public T saveOrUpdate(Realm realm, T t) {
    return realm.copyToRealmOrUpdate(t);
}

我之所以这样问,是因为重写架构以使用以下内容将需要重写我拥有的每个 populateRealmListWithMappedModel() 方法,如果它不起作用,那就有点担心了。所以我很好奇它在理论上是否有效。

基本上简短的问题是,如果我在 realmObject 上调用 copyToRealmOrUpdate(t),并更改其 id 和数据,并一次又一次地保存相同的对象,写入事务会成功吗?

【问题讨论】:

    标签: android realm


    【解决方案1】:

    是的,您可以重新使用用作copyToRealm 输入的对象。我们正在创建您的输入对象的副本,但不会以任何方式更改原始对象,因此像您一样重用该对象应该可以工作,并且还将减少 GC 必须执行的工作量。

    Person javaPerson = new Person();
    Person realmPerson = realm.copyToRealm(javaPerson);
    
    // The following is true
    assertTrue(javaPerson != realmPerson)
    assertFalse(javaPerson.equals(realmPerson))
    assertFalse(realmPerson.equals(javaPerson))
    

    【讨论】:

    • 太棒了!谢谢你。那我在日程上做了一点优化!
    【解决方案2】:

    是的,它成功了。

    @Override
    public void persist(Realm realm, SchedulesXML schedulesXML) {
        Schedule defaultSchedule = new Schedule();
        if(schedulesXML.getSchedules() != null) {
            realm.beginTransaction();
            for(SchedulesByChannelXML schedulesByChannelXML : schedulesXML.getSchedules()) {
                Channel channel = channelRepository.findOne(realm, schedulesByChannelXML.getChannelId());
                if(channel == null) {
                    Log.w(TAG,
                            "The channel [" + schedulesByChannelXML.getChannelId() + "] could not be found in Realm!");
                }
                for(ScheduleForChannelXML scheduleForChannelXML : schedulesByChannelXML.getSchedules()) {
                    defaultSchedule = scheduleMapper.toRealmObject(realm, scheduleForChannelXML, defaultSchedule);
                    defaultSchedule.setChannel(channel);
                    defaultSchedule.setChannelId(schedulesByChannelXML.getChannelId());
                    boolean isInRealm = scheduleRepository.findOne(realm,
                            scheduleForChannelXML.getScheduleId()) != null;
                    Schedule savedSchedule = scheduleRepository.saveOrUpdate(realm, defaultSchedule);
                    if(!isInRealm) {
                        if(channel != null) {
                            channel.getSchedules().add(savedSchedule);
                        }
                    }
                }
            }
            realm.commitTransaction();
        }
    }
    

    我不是每次保存这批计划时都创建 150 个计划,现在我每批只创建一个,并且可以完美运行。

    【讨论】:

      猜你喜欢
      • 2020-04-21
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2015-01-13
      • 2017-07-22
      • 2010-12-18
      • 1970-01-01
      • 2020-04-29
      相关资源
      最近更新 更多