是否可以重用具有不同ID的相同RealmObject实例来保存/更新写入事务中的多个对象?

时间:2015-10-01 10:56:13

标签: android realm

目前,我们正在为要在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和数据,并一次又一次地保存同一个对象,那么写事务会成功吗?

2 个答案:

答案 0 :(得分:2)

是的,您可以重复使用用作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))

答案 1 :(得分:0)

是的,它有效。

@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计划,现在我每批只创建一个,并且它可以完美地运行。