Android Realm, очевидно, создает список, но затем говорит, что его размер равен 0
Я разрабатываю приложение для Android, которое использует Realm в качестве базы данных.
Эта база данных уже содержит некоторые данные, когда пользователь ее устанавливает. Проблема в том, что некоторые из этих объектов Realm имеют список других объектов, которые, очевидно, создаются, поскольку я видел это в отладчике, но когда я пытаюсь получить доступ к этому списку, как realmObject.getList.size();
результирующий вывод равен 0.
Более конкретно, у меня есть эта модель:
public class Muscle extends RealmObject{
@PrimaryKey
private int id;
private String name;
private RealmList<Routine> routines;
public Muscle(String name){
this.id = MyApplication.MuscleID.incrementAndGet();
this.name = name;
this.routines = new RealmList<Routine>();
}
public Muscle(){}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public RealmList<Routine> getRoutines() {
return routines;
}
}
И этот:
public class Routine extends RealmObject {
@PrimaryKey
private int id;
@Required
private String name;
private RealmList<Detail> details;
public Routine(String name){
this.id = MyApplication.RoutineID.incrementAndGet();
this.name = name;
this.details = new RealmList<Detail>();
}
public Routine(){}
public int getId() {
return id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public RealmList<Detail> getDetails() {
return details;
}
}
Записи вставляются в область, так как я могу получить к ним доступ и отобразить их в своем приложении (по крайней мере, в записях Muscle), и в отладчике я вижу, что Routine
список также создается, но я не могу получить доступ к каждой процедуре мышц.
В MyApplication.java, где я сохраняю эти записи, операции с областями в основном выглядят так:
public class MyApplication extends Application {
public DateFormat df;
public static AtomicInteger MuscleID = new AtomicInteger();
public static AtomicInteger RoutineID = new AtomicInteger();
public static AtomicInteger DetailID = new AtomicInteger();
@Override
public void onCreate() {
super.onCreate();
Realm.init(getApplicationContext());
setUpRealmConfig();
Realm realm = Realm.getDefaultInstance();
MuscleID = getIdByTable(realm, Muscle.class);
RoutineID = getIdByTable(realm, Routine.class);
DetailID = getIdByTable(realm, Detail.class);
realm.close();
}
private void setUpRealmConfig() {
RealmConfiguration config = new RealmConfiguration.Builder().initialData(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
Muscle chest = new Muscle(getString(R.string.chest));
realm.copyToRealmOrUpdate(chest);
Muscle legs = new Muscle(getString(R.string.legs));
realm.copyToRealmOrUpdate(legs);
Routine cr1 = new Routine(getString(R.string.beginner_chest_1));
realm.copyToRealmOrUpdate(cr1);
chest.getRoutines().add(cr1);
}
})
.deleteRealmIfMigrationNeeded()
.build();
Realm.setDefaultConfiguration(config);
}
Там больше, но это соответствующий код. Я позаботился о том, чтобы идентификаторы каждой модели автоматически увеличивались, и это работает нормально, все мышечные объекты вставляются в базу данных, и я могу видеть их в моем приложении без проблем, однако процедуры, очевидно, созданы, так как я наблюдаю за изменением размера списка и идентификатор увеличивается в отладчике, но когда я пытаюсь получить к нему доступ в моем адаптере, как int workoutsNumber = muscle.getRoutines().size();
, Номер тренировки становится 0.
Я не знаю, в чем здесь проблема. В отладке все выглядит нормально, кроме одной вещи, которую я не понимаю. Первым делом в отладчике всегда есть muscle = cannot find local variable 'muscle'
Вот снимок экрана, на котором вы видите, как эффективно создаются объекты, и к объекту мышцы добавляется список процедур, а также ошибка, о которой я упоминал выше: отладочный снимок экрана
Так почему я получаю 0 при выполнении int workoutsNumber = muscle.getRoutines().size();
если размер списка должен быть 3?
1 ответ
Routine cr1 = new Routine(getString(R.string.beginner_chest_1));
realm.copyToRealmOrUpdate(cr1);
chest.getRoutines().add(cr1);
Должно быть
Muscle chest = new Muscle(getString(R.string.chest));
Muscle managedChestProxy = realm.copyToRealmOrUpdate(chest);
Routine cr1 = new Routine(getString(R.string.beginner_chest_1));
Routine managedRoutineProxy = realm.copyToRealmOrUpdate(cr1);
managedChestProxy.getRoutines().add(managedRoutineProxy);