Возьмем следующий пример:
Для ПРОДУКТОВ и ЗАКАЗОВ существует сопоставление "многие ко многим". Таким образом, продукт может находиться в нескольких заказах, а в заказе может быть несколько продуктов. В комнате у меня есть объект, у которого есть как идентификатор продукта, так и идентификатор заказа в качестве внешних ключей, поэтому я могу сохранить отношения. Теперь очень легко получить все заказы на конкретный продукт, а также все продукты для определенного заказа.
Вот и проблема. Насколько мне известно, невозможно получить объект заказа со всеми его продуктами в 1 запросе / объекте. Подробнее об этом можно прочитать в этот пост. В большинстве случаев я могу обойти это, просто выполнив два запроса. Первый получает интересующий меня заказ, а второй - товары на основе идентификатора заказа.
Теперь я хочу отобразить комбинацию заказа с его товарами в адаптере. Для этого мне нужно объединить все мои заказы с их товарами. Я не знаю, как решить эту проблему с помощью LiveData.
На мой взгляд, лучшим решением было бы создать один запрос, который извлекает OrderWithProducts непосредственно из базы данных. В этом сообщении говорится, что это должно быть возможно, но мне не удалось заставить это работать. Также отсутствует самая важная часть в этом примере: класс OrderItem.
Если это решение невозможно, должен быть способ получить список LiveData OrderWithProducts с двумя запросами и как-то их объединить.
ИЗМЕНИТЬ После предложений @Demigod теперь у меня в ViewModel есть следующее:
// MediatorLiveData can observe other LiveData objects and react on their emissions.
var liveGroupWithLights = MutableLiveData<List<GroupWithLights>>()
fun createOrdersWithProducts() {
appExecutors.diskIO().execute {
val ordersWithProducts = mutableListOf<OrderWithProducts>()
val orders = orderRepository.getGroupsSync()
for (order in orders) {
val products = productRepository.getProductsSync(order.id)
val orderWithProducts = OrderWithProducts(order, products)
ordersWithProducts.add(orderWithProducts)
}
liveGroupWithLights.postValue(ordersWithProducts)
}
}
Функция внутри моего фрагмента для отправки данных в адаптер:
private fun initRecyclerView() {
orderListViewModel.getOrdersWithProducts().observe(this, Observer { result ->
adapter.submitList(result)
})
}
Итак, теперь я могу использовать объект OrderWithProduct в качестве элемента для моего адаптера. Это здорово, я могу использовать продукты для каждого заказа в моем адаптере. Теперь у меня возникают проблемы с обновлением этих элементов при изменении значений в базе данных. Есть идеи по этой части?
Edit2: трекер недействительности
db.invalidationTracker.addObserver(object : InvalidationTracker.Observer("orders", "products", "order_product_join") {
override fun onInvalidated(tables: MutableSet<String>) {
createOrdersWithProducts()
}
})
Проблема, с которой я столкнулся сейчас, заключается в том, что средство отслеживания валидации получает много уведомлений об одном изменении.