我在Livedata中使用了Room和RxJavaSingle
,但它不起作用
我试了两种方法。我不知道为什么第二个有效,为什么第一个无效。
(1( 按单个获取列表->不起作用
(2(按Livedata获取列表->工作
(1( 按单个获取列表
DAO
@Dao
interface DiaryDao {
@Query("SELECT * FROM Review")
fun getAllReview() : Single<List<Review>> // <- See the return type!
}
ViewModel我使用了Repository模式(dao的返回类型和Repository的返回类型相同(
private val _reviewData = MutableLiveData<List<Review>>()
val reviewData : LiveData<List<Review>>
get() = _reviewData
fun getAllReview(){
addDisposable(repo.getAllReview()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe({
_reviewData.value=it
},{
Log.d(TAG, it.localizedMessage)
})
)
}
碎片
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.getAllReview()
viewModel.reviewData.observe(viewLifecycleOwner) {
...
}
}
它在创建片段时工作,但数据在更改时不会更新。
(2( 按Livedata获取列表
DAO
@Dao
interface DiaryDao {
@Query("SELECT * FROM Review")
fun getAllReview() : LiveData<List<Review>> // <- See the return type!
}
ViewModel
private val _reviewData : LiveData<List<Review>> = repo.getAllReview()
val reviewData : LiveData<List<Review>>
get() = _reviewData
碎片
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
viewModel.reviewData.observe(viewLifecycleOwner) {
// it works!
}
}
当数据发生变化时,它能很好地工作。
为什么要使用第二种方法?有没有办法使第一种方法奏效
我期待你的建议。
如果您想查看任何其他代码,请告诉我。
Single<List<Review>>
是一个单独的操作,它要么返回数据,要么不返回数据,并且只执行一次。你想要的是Flowable<List<Review>>
。这将允许您订阅数据库并监视更改,当发生更改时,它将向订阅者报告。