Запись в БД не сохраняет ассоциации

#java #android #realm

#java #Android #область

Вопрос:

Я пытаюсь записать несколько объектов в свою базу данных realm.

Поскольку они связаны с другим объектом (RealmUser), я добавляю их в его RealmList<RealmActivity> via getActivities().addAll(activities) .

Я пробовал это с и без предварительного копирования коллекции в область через copyToRealm(activities) и вот в чем проблема. Похоже, это работает до тех пор, пока я не перезапущу свое приложение (или, как ни странно, когда я вернусь к другому действию). Как только я это делаю, действия по-прежнему сохраняются в базе данных, но они больше не связаны с пользователем. Я попробовал realm.copyToRealmOrUpdate(user); и realm.insertOrUpdate(user); (как вы можете видеть в коде), и он не будет сохранять ассоциации дольше, чем для этого действия.

Я предполагаю, что ассоциации хранятся в памяти, но никогда не передаются в фактический файл (?), И как только я покидаю действие, образ памяти моей БД удаляется, что приводит к потере ассоциаций, тогда как мои фактические данные сохраняются в фактическом файле. Итак, что мне нужно сделать, чтобы сохранить ассоциации?

 try(Realm realm = Realm.getDefaultInstance())
{
    realm.executeTransaction(new Realm.Transaction()
    {
        @Override
        public void execute(Realm realm)
        {
            RealmUser user = realm.where(RealmUser.class).equalTo("userId", userId).findFirst();
            List<RealmActivity> tmp = realm.copyToRealm(activities);

            user.getActivities().addAll(tmp);
            user.getVitalData().addAll(realm.copyToRealm(vitalData));
            user.getDailyActivities().addAll(realm.copyToRealm(dailies));

            realm.copyToRealmOrUpdate(user);
            realm.insertOrUpdate(user);
        }
    });
}
  

Комментарии:

1. Вам не нужно сохранять ассоциации. Показанный вами код должен сохранять ассоциации на диск. Является userId ли первичный ключ? copyToRealmOrUpdate() и insertOrUpdate оба должны работать здесь. Вы когда-нибудь копировали пользователя в БД с пустым activities значением при запуске приложения? Это перезапишет пользовательский объект такими же userId пустыми списками в пользовательском объекте.

2. Спасибо тысячу раз и больше за этот комментарий. Я действительно сохранил пользователя с пустым списком действий, который вообще не предназначался! Еще раз спасибо!

Ответ №1:

Как уже указывал beeender, я сохранял экземпляр пользователя с пустым списком действий каждый раз, когда я входил в систему. В этом и заключалась проблема.