Как подписаться на Room таким образом что б по дороге мапить данные в ViewModel
Есть DAO
@Dao
interface RestaurantDao {
@Query("SELECT * FROM restaurant")
fun getAll(): LiveData<List<RestaurantEntity>>
@Insert
fun insertAll(employees: List<RestaurantEntity>)
}
Я подписываюсь на него в RestaurantsRepository (тут же я хочу конвертировать их в RestaurantModel)
override fun get(): LiveData<List<RestaurantEntity>> = dataBase.restaurantDao().getAll()
В ViewModel я хочу подписаться на данные
repository.get()
Проверить есть они или нету, если есть - засунуть в LiveData на которую подписана view, если нет - загрузить их после чего сделать repository.insertAll(...)
После insertAll снова должен сработать слушатель repository.get() и повторить свою логику
Как это правильно реализовать?
Ответы (2 шт):
Автор решения: Сергей Бувака
→ Ссылка
Думаю, это должно помочь:
private fun madLiveData(): LiveData<Int> {
return Transformations.map(dao.getLiveDataModel()) { model: Model ->
doSomething(model)
model.id
}
}
private fun doSomething(Model: Model) {
//do something
}
Тут можно больше посмотреть о LiveData
Автор решения: Pavel Zlotarenchuk
→ Ссылка
Вот окончательный код который работает
restaurantList = Transformations.map(restaurantsRepository.get(), Function { list ->
if (list.isNullOrEmpty()) {
loadRestaurants()
emptyList()
} else {
list.map { RestaurantMapper.fromEntityToModel(it) }
}
})