Как подписаться на 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

https://startandroid.ru/ru/courses/architecture-components/27-course/architecture-components/526-urok-3-livedata.html

→ Ссылка
Автор решения: Pavel Zlotarenchuk

Вот окончательный код который работает

restaurantList = Transformations.map(restaurantsRepository.get(), Function { list ->
            if (list.isNullOrEmpty()) {
                loadRestaurants()
                emptyList()
            } else {
                list.map { RestaurantMapper.fromEntityToModel(it) }
            }
        })
→ Ссылка