Объект Realm не обновляется после добавления в него объектов.
Может кто-нибудь объяснить это мне? Это мой код, и после, я собираюсь показать журналы. Дело в том, что у меня есть список объектов. Я регистрирую его размер: 1. Я очищаю его, становится 0. Я добавляю в него объекты, а он все еще 0.
Это мой код:
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE" + index);
RealmList<TripStep> tripsteps = psTrip.getTripSteps();
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE2:" + psTrip.getTripSteps().size());
realmActive.beginTransaction();
TripStep tripStep = realmActive.copyToRealmOrUpdate(updateStepResponse.getStep());
realmActive.commitTransaction();
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE3 + index is:" + index);
realmActive.beginTransaction();
tripsteps.set(index, tripStep);
realmActive.commitTransaction();
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE4");
if (isRoaming) {
if ((tripsteps.size() - 2 == index) && !Utils.hasStarted(PSNewJourneyActivity.this)) {
realmActive.beginTransaction();
tripsteps.get(tripsteps.size() - 1).setTravelMode(updateStepResponse.getStep().getTravelMode());
realmActive.commitTransaction();
}
}
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip:" + tripSteps.size());
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip before:" + psTrip.getTripSteps().size());
realmActive.beginTransaction();
psTrip.getTripSteps().clear();
realmActive.commitTransaction();
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip AFTER CLEAR:" + psTrip.getTripSteps().size());
realmActive.beginTransaction();
for (TripStep tripStep1 : tripsteps){
psTrip.getTripSteps().add(tripStep1);
}
realmActive.commitTransaction();
realmActive.beginTransaction();
realmActive.copyToRealmOrUpdate(psTrip);
realmActive.commitTransaction();
Log.i("", "update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE6 tripstep size:" + psTrip.getTripSteps().size());
Handler han = new Handler();
han.postDelayed(new Runnable() {
@Override
public void run() {
continueInit(true, true);
ProgressForMap(true);
}
}, mapDelay);
Это мой журнал:
update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE0
09-09 10:12:11.219 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE2:1
09-09 10:12:11.251 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE3 + index is:0
09-09 10:12:11.257 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE4
09-09 10:12:11.257 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip:1
09-09 10:12:11.257 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip before:1
09-09 10:12:11.264 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE5 tripsteps not in pstrip AFTER CLEAR:0
09-09 10:12:11.277 32740-32740/nl.hgrams.passenger I/﹕ update step pitstop 1 BEFORE TEST FOR ACTIVE -> ACTIVE6 tripstep size:0
1 ответ
Это немного загадочно. Я хотел бы сказать следующее:
// this part makes sense
realmActive.beginTransaction();
for (TripStep tripStep1 : tripsteps){
psTrip.getTripSteps().add(tripStep1);
}
realmActive.commitTransaction();
// why are you then doing this?
//realmActive.beginTransaction();
//realmActive.copyToRealmOrUpdate(psTrip);
//realmActive.commitTransaction();
Насколько я могу судить, первой части должно быть достаточно, вторая часть ничего не делает.
ОБНОВИТЬ:
Просто заметил, что ваша переменная tripsteps
назначается здесь:
RealmList<TripStep> tripsteps = psTrip.getTripSteps();
а потом вы делаете это:
psTrip.getTripSteps().clear();
tripsteps
а также psTrip.getTripSteps()
указывают на один и тот же объект, поэтому при вызове psTrip.getTripSteps().clear();
вы также очищаете tripsteps
,
Так что на данный момент ничего не будет в tripsteps
:
for (TripStep tripStep1 : tripsteps){ // tripsteps.size() == 0
psTrip.getTripSteps().add(tripStep1);
}
Я думаю, что вам нужно "глубокое копирование" вашего arraylist:
Это не верно:
RealmList<TripStep> tripsteps = psTrip.getTripSteps();
Сделайте это вместо этого:
RealmList<TripStep> tripsteps = cloneList(psTrip.getTripSteps());
public List<TripStep> cloneList(RealmList<TripStep> list) {
List<TripStep> clone = new ArrayList<TripStep>(list.size());
for(TripStep item : list){
clone.add(new TripStep(item));
}
return clone;
}
Вам нужно будет создать конструктор в вашем TripStep
класс, который может копировать форму другого экземпляра:
class TripStep
{
public TripStep()
{ ... } // Regular constructor
public TripStep(TripStep cloneFrom) {
// Copy all the fields of TripStep.
}
}