小编Nic*_*lde的帖子

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

所以我的一般问题是如何从 @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)

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

android dao kotlin android-room android-viewmodel

5
推荐指数
1
解决办法
6067
查看次数

如何使用 android room (Kotlin) 返回新插入的项目(行)id?

我正在对许多类似的主题使用类似的解决方案,但它仍然不想工作,并且无法弄清楚为什么:

我的实体

@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。它不会改变。可能出了什么问题?

android kotlin android-room

2
推荐指数
1
解决办法
3038
查看次数

标签 统计

android ×2

android-room ×2

kotlin ×2

android-viewmodel ×1

dao ×1