从 Room DB 获取单个项目。从视图模型调用函数

Get single item from Room DB. Call the function from view model

所以我的一般问题是如何从@Query 的视图模型调用一个函数,您必须传递一些东西然后 return 一些东西。 我的简单示例:

DAO

@Query ("SELECT * FROM table_name WHERE id = :id LIMIT 1")
fun getItemById (id: Long) : MyItem

回购

fun getItemById (id: Long) : MyItem {
return itemDao.getItemById(id)
}

我知道它不能也不应该在 ui 线程上完成。为了插入和删除一个项目,我使用 viewModelScope 作业,但我不能(也许只是不知道如何)将它用于 return 任何事情。 如果我 return 它无处不在作为 LiveData,那么它就像这样工作:

ViewModel

fun itemById(id: Long): LiveData<MyItem> {
 return itemRepo.getItemById(id)
}

然后我在Fragment/Activity中观察它:

viewModel.itemById(id).observe(this, Observer {
 // using it
})

问题是,我真的不需要它成为可观察的实时数据。我只需要得到它一次,检查条件就可以了。 所以也许有人可以推荐如何去做,而不是实时数据。或者我应该保留实时数据吗?

如果你只想获取一次更新,那么我推荐使用 SingleLiveEvent 而不是 LiveData。 这是google提供的class:Github link

关于如何使用它的博客:Link

SingleLiveEvent 的唯一缺点是它不能有多个观察者。

如果你不喜欢 LiveData,你可以试试 RxJava 的 Single [Observable]