簡體   English   中英

使用 Transformations.map 在 ViewModel 中處理 Room 數據庫中的 LiveData

[英]Processing LiveData from Room database in ViewModel with Transformations.map

我有以下簡單的數據庫:

NameList.kt

@Entity(tableName = "name_list")
data class NameList(
        @PrimaryKey(autoGenerate = true)
        var id: Long = 0L,

        @ColumnInfo(name = "name")
        var name: String = "")

NameListDao.kt

@Dao
interface NameListDao{    
    @Insert
    fun insert(nameList: NameList)

    @Update
    fun update(nameList: NameList)

    @Query("SELECT * FROM name_list ORDER BY id DESC")
    fun getAll(): LiveData<List<NameList>>
}

NameListRepository.kt

class NameListRepository(private val nameListDao: NameListDao){
    val allNames: LiveData<List<NameList>> = nameListDao.getAll()
}

MyViewModel.kt

class MyViewModel(app: Application): AndroidViewModel(app){
    private val nameListDao = NameListDatabase.getInstance(app).nameListDao
    private val repository: nameListRepository = nameListRepository(nameListDao)
    private val allNames: LiveData <List<NameList>> = repository.allNames
    ...
}

目前我只想獲取和處理這個非空數據庫的最后一個條目(不更改/添加NameListDao方法)。

在片段中,使用observe方法很容易獲取並顯示(在TextView通過數據綁定)最后一個數據庫條目:

viewModel.allNames.observe(this, Observer<List<NameList?>> { 
    nameList ->  binding.textView.text = nameList[nameList.lastIndex]!!.name 
}) 

據我發現,在ViewModel需要使用Transformations.mapTransformations.switchMap來處理LiveData 為了獲取數據庫的最后一個條目並將其傳遞給方法doSomethingWithName()我嘗試了以下兩(四)種轉換方法doSomethingWithName() 但是,在所有情況下,傳遞的參數顯然都是空的。 (我也通過[0]嘗試了第一個條目,但我得到了相同的結果)

class MyViewModel(app: Application): AndroidViewModel(app){
    private val nameListDao = NameListDatabase.getInstance(app).nameListDao
    private val repository: nameListRepository = nameListRepository(nameListDao)
    private val allNames: LiveData <List<NameList>> = repository.allNames

    private var _lastName = ""

    init{
        Transformations.map(allNames, ::getLastName1)          //first try
        //Transformations.switchMap(allNames, ::getLastName2)  //second try    

        doSomethingWithName(_lastName) //commented when executed in getLastName()
    }

    private fun doSomethingWithName(name: String){ ... }

    private fun getLastName1(nameList: List<NameList>){
        val names: MutableList<String> = ArrayList()
        nameList.forEach { names.add(it.name) } 
        val lastName = names[names.lastIndex]
        //doSomethingWithName(lastName) //third try
        _lastName = lastName
    }

    private fun getLastName2(nameList: List<NameList>): LiveData<NameList>{
        val liveData: MutableLiveData<NameList> = MutableLiveData(nameList[nameList.lastIndex])
        val lastName = liveData.value!!.name
        //doSomethingWithName(lastName) //fourth try
        _lastName = lastName
        return liveData
    }
}

我在這里缺少什么?

如果您想獲取列表中的最后一個值,請考慮列表也可能為空...

class MyViewModel(app: Application): AndroidViewModel(app){
    private val nameListDao = NameListDatabase.getInstance(app).nameListDao
    private val repository: nameListRepository = nameListRepository(nameListDao)
    private val allNames: LiveData <List<NameList>> = repository.allNames
    private var _lastName = ""

    private val theLatestName =  MutableLiveData<NameList?>()
    init {
       allNames.observe(getAReferenceToaLifeCycleOwner, Observer{
         theLastestName.postValue(it.lastOrNull())
       })
       //make sure to get rid of the observer once this instance
       //of the viewmodel is destroyed
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM