Kotlin Room Cooroutines возвращает значение из запроса - PullRequest
0 голосов
/ 30 апреля 2020

I wi sh для возврата значения из запроса на вставку при использовании Kotlin, room и co-рутины

Это мой код в последовательности от ViewModel до Repo в DAO. Я хотел бы вернуть результат вызова вставки в первом вызове ViewModel, но не могу понять, как

ViewModel

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

Репозиторий

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

DAO

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

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Уберите переменную LiveData в вашем ViewModel и наблюдайте за ней в своем представлении (активность, фрагмент), а когда ваш couroutine завершит публикацию возвращаемого значения запроса вставки в переменную LiveData, которая затем может сообщить ваше мнение.

Таким образом, вы не ждете завершения запроса вставки, а просто запускаете запрос и наблюдаете LiveData, который информирует вас о результате.

В вашей ViewModel

// 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");
  }
)
0 голосов
/ 30 апреля 2020

Вы можете сделать одно из:

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)

Возможно, вам не нужен последний. Выбор зависит от того, что делает потребитель.

...