所以我的一般问题是如何从 @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)
问题是,我真的不需要它成为可观察的实时数据。我只需要拿到一次,检查一下状况就可以了。所以也许有人可以建议如何做到这一点,而不需要它是实时数据。或者我应该将其保留为实时数据?
我正在对许多类似的主题使用类似的解决方案,但它仍然不想工作,并且无法弄清楚为什么:
我的实体
@Entity(tableName = "single_item")
data class SingleItem (
@PrimaryKey(autoGenerate = true)
val id: Long? = 0L,
val name: String,
val icon: String,
val price: Int)
Run Code Online (Sandbox Code Playgroud)
DAO
@Insert
suspend fun insertItem(item: SingleItem): Long
Run Code Online (Sandbox Code Playgroud)
回购协议
suspend fun insertItem(item: SingleItem): Long {
return myDao.insertItem(item)
}
Run Code Online (Sandbox Code Playgroud)
视图模型
var insertedId = 0L
fun insertItem(item: SingleItem) = viewModelScope.launch {
insertedId = myRepository.insertItem(item)
}
Run Code Online (Sandbox Code Playgroud)
最后,从 Fragment 调用
val newItem = SingleItem(null, "name","icon_name", 9999)
viewModel.insertItem(newItem)
Log.i("INSERT_ID", "Inserted ID is: ${viewModel.insertedId}")
Run Code Online (Sandbox Code Playgroud)
在我检查日志后,insertedId变量总是返回0。它不会改变。可能出了什么问题?