通过Room live查询进行生命周期状态管理

时间:2019-01-11 18:22:14

标签: android android-room android-lifecycle android-livedata

我有一个具有三种状态的视图:

sealed class MainState(val movieList: List<Movie>) {
    class Loading(movies: List<Movie> = emptyList()) : MainState(movies)
    class Success(movies: List<Movie>) : MainState(movies)
    class Error(val throwable: Throwable, movies: List<Movie> = emptyList()) : MainState(movies)
}

这些状态包含在MutableLiveData中,并由ViewModel管理:

class MovieListViewModel(private val movieRepo: MovieRepository) : ViewModel() {
    val stateLiveData = MutableLiveData<MainState>()
    .
    .
}

我想将查询liveData集成到我的状态liveDate,以便当查询liveData更新到movieList时,状态liveData更新到Success(movieList)。我该如何实现?

这是我的实时查询的样子:

@Dao
interface MovieDAO {
@Query("SELECT * FROM Movie")
   fun getAllMovies(): LiveData<List<Movie>>
}

2 个答案:

答案 0 :(得分:1)

如果您已经安装了Room的RxJava2支持,我将考虑以下内容:

val stateLiveData = MutableLiveData<MainState>()

dao().getAllMovies()
     .subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .doOnSubscribe(() -> stateLiveData.value = Loading(emptyList()))
     .subscribeBy(
         onNext = { stateLiveData.value = Success(it) }
         onError { stateLiveData(it, emptyList()) }         
      )

当然,您需要将Room查询的返回类型更改为Flowable<MainState>Observable<MainState>

答案 1 :(得分:0)

可以使用MediatorLiveData来完成。

  

LiveData子类,可以观察其他LiveData对象并做出反应   它们中的OnChanged事件。

解决方案如下:

    val stateLiveData = MediatorLiveData<MainState>()

    init {
        stateLiveData.addSource(movieRepo.getAllMovies()) {
            stateLiveData.value = Success(it)
        }
    }

有关更多信息,请选中此出色的post