В настоящее время есть два разных способа сделать это.Первый заключается в использовании функции построителя liveData.Чтобы это работало, вам нужно обновить жизненный цикл до androidx.lifecycle:*:2.2.0-alpha01
или более новой версии.Функция построителя LiveData будет использоваться для асинхронного вызова getData (), а затем использовать emit () для выдачи результата.Используя этот метод, вы измените функцию Room getData () на функцию приостановки и сделаете возвращаемый тип обернутым как LiveData, заменив использовавшийся ранее Flowable.
@Query("SELECT * FROM somedata_table")
abstract suspend fun getData(): LiveData<List<SomeData>>
В вашей модели представления вы создаете liveData, которыйссылается на вашу базу данных Room
val someData: LiveData<SomeData> = liveData {
val data = database.myDao().getData()
emit(data)
}
Второй подход заключается в получении данных из нашей БД как Flow.Чтобы использовать это, вам нужно обновить Room до androidx.room:room-*:2.2.0-alpha02
(на данный момент самая последняя версия) или более новую версию.Это обновление позволяет методам @Query DAO иметь возвращаемый тип Flow. Возвращенный Flow повторно отправит новый набор значений, если таблицы наблюдения в запросе будут признаны недействительными.Объявление функции DAO с типом возвращаемого канала является ошибкой, вместо этого Room рекомендует вам использовать Flow, а затем использовать соседние функции для преобразования потока в канал.
@Query("SELECT * FROM somedata_table")
abstract suspend fun getData(): Flow<List<SomeData>>
Для извлечения и обновления данных мыпреобразует поток полученных холодных данных в горячий канал в нашей Presenter / ViewModel.Лучше сделать это в ViewModel из компонентов архитектуры Android.Приведенное ниже решение предполагает, что мы делаем это в ViewModel, где у нас есть предоставляемая viewModelScope.
fun loadData(){
val channel = database.myDao().getData().distinctUntilChanged().produceIn(viewModelScope)
viewModelScope.launch {
for(i in channel){
withContext(Dispatchers.Main){ /** Update your obsevable data type with i **/ }
}
}
}