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);
Другие вопросы по тегам