Два объекта в Live Data ссылаются друг на друга

У меня есть два объекта (Object1 и Object2), сохраненные через Android Room, к которым я хочу получить доступ с помощью LiveData. Object1 содержит ссылку на Object2.

public class Object1 {

...

private Object2 object2;

...

}

Я хочу передать LivaData<List<Object1>>, содержащий все мои объекты из ViewModel, в Activity, каждый Object1 уже сохранил ссылку на соответствующий Object2 (Object1 хранит идентификатор Object2 в базе данных).

Как лучше всего сочетать предметы? Я нашел MediatorLiveData и MutableLiveData, но не смог найти пример, который мне показался бы полезным.

Изменения: В целом ситуация: Object1 - это некоторые данные, которые я загружаю из Интернета и кэширую через Android Room. Object2 - это некоторые дополнительные данные, которые пользователи могут сохранять локально, всегда относящиеся к данным из одного конкретного Object1. Таким образом, каждый Object2 связан с Object1, но не каждый Object1 имеет Object2. Наконец, я хочу передать объект пользовательскому интерфейсу, содержащий все данные из Интернета и (если есть) все дополнительные данные, добавленные к нему пользователями.

Проблема: я не знаю, как наиболее эффективно сопоставить данные из двух разных источников данных таким образом, чтобы LiveData всегда обновлялась при изменении одного из них.

Спасибо за помощь в изучении Android


person Florian T    schedule 17.03.2020    source источник
comment
Мне не ясно, что вы имеете в виду под объединением объектов. Измените вопрос, чтобы лучше описать, с какой проблемой вы столкнулись, и вашу конечную цель.   -  person Doug Stevenson    schedule 18.03.2020
comment
@DougStevenson Спасибо. Я отредактировал свой вопрос, надеюсь, теперь все ясно   -  person Florian T    schedule 18.03.2020
comment
Если вы используете Room, вам следует использовать JOIN через @Embedded, чтобы получить комбинированный объект.   -  person EpicPandaForce    schedule 18.03.2020
comment
@EpicPandaForce большое спасибо, что решили мою проблему!   -  person Florian T    schedule 19.03.2020


Ответы (1)


если вы пытаетесь получить объект1 и объект1, вы получите данные объекта2, а затем хотите передать их наблюдателям, вы должны использовать MediatorLiveData.

 private MediatorLiveData<Object1> object2 = new MediatorLiveData<>();

  object2.addSource(sourceObject1, object1 -> {
           // retrieve object2 from id inside object1
        });
person John    schedule 18.03.2020