【问题标题】:Kotlin Room Cooroutines return value from queryKotlin Room Cooroutines 从查询返回值
【发布时间】:2020-04-30 14:09:21
【问题描述】:

我希望在使用 Kotlin、房间和协同程序时从插入查询中返回一个值

这是我的代码,从 ViewModel 到 Repo 再到 DAO。我想在第一个 ViewModel 调用中返回插入调用的结果,但我不知道如何

视图模型

 fun insert(collectionItem: CollectionItem) = viewModelScope.launch {
        repository.insertCollectionItem(collectionItem)
    }

存储库

suspend fun insertCollectionItem(coll: CollectionItem): Long {
        return mCollectionItemDao.insert(coll)
    }

 @Insert(onConflict = OnConflictStrategy.REPLACE)
    suspend fun insert(coll: CollectionItem): Long

【问题讨论】:

    标签: android kotlin android-room kotlin-coroutines


    【解决方案1】:

    您可以执行以下操作之一:

    suspend fun insert(collectionItem: CollectionItem): Long {
        return repository.insertCollectionItem(collectionItem)
    }
    
    viewModel.insert(item)
    
    fun insert(collectionItem: CollectionItem) = viewModelScope.async {
        repository.insertCollectionItem(collectionItem)
    }
    
    viewModel.insert(item).await()
    
    fun insert(collectionItem: CollectionItem) = runBlocking {
        repository.insertCollectionItem(collectionItem)
    }
    
    viewModel.insert(item)
    

    你可能不想要最后一个。选择取决于消费者在做什么。

    【讨论】:

    • 这在我的用例中不起作用,但感谢您花时间提供帮助
    【解决方案2】:

    在您的ViewModel 中声明一个LiveData 变量并在您的视图(活动、片段)中观察它,当您的couroutine 完成将插入查询的返回值发布到LiveData 变量时,该变量可以通知您看法。

    通过这种方式,您无需等待插入查询完成,而是只需启动查询并观察LiveData,它会通知您结果。

    在您的视图模型中

    // Declare LiveData variable
    val rowsInserted: MutableLiveData<Int> = MutableLiveData()
    
    //Update your coroutine
    fun insert(collectionItem: CollectionItem) = viewModelScope.launch {
        val result = repository.insertCollectionItem(collectionItem)
        rowsInserted.postValue(result)
    }
    

    并观察活动中的 LiveData 以获得插入的结果

    viewModel.rowsInserted.observe(this, Observer {
       Log.d(TAG, "$it rows inserted");
      }
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-12
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多