Проблема получения данных из room во ViewModel, используя Transformations.map

Рейтинг: 0Ответов: 1Опубликовано: 15.07.2023

У нас есть recyclerview, ViewModel и room, из которого необходимо получать данные во ViewModel, после чего отобразить их в recyclerview. Во ViewModel необходимо вытащить данные из Flow, после чего отобразить их в recyclerview. Проблема заключается в том, что во ViewModel не удаётся получить данные из Room.

DB0ViewModel.kt:

class DB0ViewModel(app: Application): AndroidViewModel(app) {
    
    val liveData = MutableLiveData<ArrayList<DataModel>>()
    init {
        val db0 = DB0.getDB0(app)
        var dataList = ArrayList<DataModel>()
        dataList.add(DataModel("test1", "test1", "tes1")) //+
        
        val DB0LiveData = db0.getDao().GetAll().asLiveData()
        Transformations.map(DB0LiveData, { list -> //-
            list.forEach{
                dataList.add(DataModel(it.id.toString(), it.Column0.toString(), it.Column1.toString()))
            }
        })
        
        dataList.add(DataModel("test2", "test2", "test2")) //+
        liveData.value = dataList
        
    }
}

MainActivity.kt:

...
db0viewmodel = ViewModelProvider(this).get(DB0ViewModel::class.java)//vm
        db0viewmodel.liveData.observe(this, androidx.lifecycle.Observer {
            initial(it)
        })
...
private fun initial(db0: ArrayList<DataModel>) {
        recyclerView = binding.recyclerViewData
        adapter = DataAdapter(this)
        recyclerView.adapter = adapter
        adapter.setList(db0)
        recyclerView.invalidate()
    }

DB0Dao.kt:

...
@Query("SELECT * FROM table0")
    fun GetAll(): Flow<List<DB0Entity>>
...

Необходимо отметить, что статичные данные, добавляемые в DB0ViewModel (помеченные комментарием +) добавляются без проблем. Также ранее при использовании .getDao().GetAll().asLiveData().observe(this){ list-> ... в MainActivity получить данные также удавалось. В чём может быть проблема и как её можно решить?

Ответы

▲ 1

Во-первых, не понятно зачем вам liveData и Transformations, если у вас уже есть flow, которое можно трансформировать итд.

db0.getDao().GetAll().map(...)

Во-вторых, по вопросу. Transformations.map вернула вам livedata, вы на нее не подписались и она умерла примерно сразу. Чтобы заработал строчка с минусом, должно быть примерно так:

val liveData = Transformations.map(db0.getDao().GetAll().asLiveData(), {
        it.map{ (DB0Entity)-> 
             DataModel(it.id.toString(), it.Column0.toString(), it.Column1.toString())}
    }
})

в activity не надо каждый раз в observe создавать адаптер и прочее, это надо сделать один раз. В observe останется примерно:

db0viewmodel.livedata.observe(viewLifecycleOwner, {
    adapter.submitList(it)
}

В третьих, если вы хотите сами наполнять dataList, там где у вас плюсики, и из room'а, там где минус, то понадобится комбинировать два источника, например через MediatorLiveData.

ЗЫ сорри за возможные опечатки в коде