debugging Android Realm显然正在创建列表,但它的大小为0

w9apscun  于 2023-11-22  发布在  Android
关注(0)|答案(1)|浏览(154)

我正在开发一个使用Realm作为数据库的Android应用程序。
这个数据库在用户安装时已经有一些数据了。问题是这个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;
    }

}


记录被插入到realm中,因为我可以在应用程序中访问和显示它们(至少是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);
    }


还有更多,但这是相关的代码。我已经确保每个模型的id自动递增,这工作正常,所有的肌肉对象都插入数据库,我可以在我的应用程序中看到它们没有问题,但是例程显然是创建的,因为我看到列表大小上升,在调试器中id递增,但是当我试图在我的适配器中访问它时,比如int workoutsNumber = muscle.getRoutines().size();,workoutsNumber变为0。
我不知道这里有什么问题。在调试中,一切看起来都很好,除了一件事我不明白。调试器中的第一件事总是muscle = cannot find local variable 'muscle'
这是一个截图,你可以看到对象被有效地创建,例程列表被添加到肌肉对象,你可以看到我上面提到的错误:debug screenshot
那么,为什么在执行int workoutsNumber = muscle.getRoutines().size();时,如果列表大小应该是3,结果会是0呢?

vqlkdk9b

vqlkdk9b1#

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);

相关问题