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

Nic*_*lde 5 android dao kotlin android-room android-viewmodel

所以我的一般问题是如何从 @Query 的视图模型调用函数,您必须传递一些内容然后返回一些内容。我的简单例子:

DAO

@Query ("SELECT * FROM table_name WHERE id = :id LIMIT 1")
fun getItemById (id: Long) : MyItem
Run Code Online (Sandbox Code Playgroud)

回购协议

fun getItemById (id: Long) : MyItem {
return itemDao.getItemById(id)
}
Run Code Online (Sandbox Code Playgroud)

我知道它不能也不应该在 ui 线程上完成。为了插入和删除项目,我使用 viewModelScope 作业,但我不能(也许只是不知道如何)使用它来返回任何内容。如果我将它作为 LiveData 返回到任何地方,那么它的工作原理就像这样:

视图模型

fun itemById(id: Long): LiveData<MyItem> {
 return itemRepo.getItemById(id)
}
Run Code Online (Sandbox Code Playgroud)

然后我在片段/活动中观察它:

viewModel.itemById(id).observe(this, Observer {
 // using it
})
Run Code Online (Sandbox Code Playgroud)

问题是,我真的不需要它成为可观察的实时数据。我只需要拿到一次,检查一下状况就可以了。所以也许有人可以建议如何做到这一点,而不需要它是实时数据。或者我应该将其保留为实时数据?

Bad*_*ane 3

如果您只想获取一次更新,那么我建议使用 SingleLiveEvent 而不是 LiveData。这是google提供的类:Github链接

有关如何使用它的博客:链接

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

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