[英]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.map
或Transformations.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.