android 我可以不使用Flow从Room查询数据并将其放入ViewModel吗?

63lcw9qa  于 2023-02-14  发布在  Android
关注(0)|答案(1)|浏览(105)

@Query("SELECT * FROM t_work WHERE id = :id")
fun id(id: Int): Work

如何在ViewModel中定义一个变量来保存从数据库中查询出来的数据呢?之所以不使用Flow,是因为要查询的数据非常简单,基本上是枚举类的函数,而且这个数据不需要是可变的,只需要查询一次。

// wrong code
class WorkViewModel @Inject constructor(private val workDao: IWorkDao): ViewModel(){
    val work = viewModelScope.async {
        workRepository.ids(listOf(1, 2, 3))
    }.await()
}

我不想在Compose中启动协同程序,它是视图层,这样会增加Compose代码的复杂度,有没有最优的解决方案?

cygmwpex

cygmwpex1#

基本上,您可以在ViewModel中启动一个协程,如下所示:

class WorkViewModel @Inject constructor(private val workDao: IWorkDao): ViewModel(){
    lateinit var work : Work

    //when view Model is created
    init {
      viewModelScope.launch(Dispatchers.IO){
         work= workDao.id(1)
      }
    }

    // or with a function
    fun updateWork(id : Int){
      viewModelScope.launch(Dispatchers.IO){
         work= workDao.id(id )
      }
    }
}

请确保按如下方式更新DAO:

@Query("SELECT * FROM t_work WHERE id = :id")
suspend fun id(id: Int): Work

这样,您就可以将操作卸载到后台调度程序。

相关问题