gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:16:17 58 4
gpt4 key购买 nike

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

我的实体

@Entity(tableName = "single_item")
data class SingleItem (
@PrimaryKey(autoGenerate = true)
val id: Long? = 0L,
val name: String,
val icon: String,
val price: Int)

DAO

@Insert
suspend fun insertItem(item: SingleItem): Long

repo 协议(protocol)

suspend fun insertItem(item: SingleItem): Long {
return myDao.insertItem(item)
}

View 模型

var insertedId = 0L
fun insertItem(item: SingleItem) = viewModelScope.launch {
insertedId = myRepository.insertItem(item)
}

最后,从 Fragment 调用

val newItem = SingleItem(null, "name","icon_name", 9999)
viewModel.insertItem(newItem)
Log.i("INSERT_ID", "Inserted ID is: ${viewModel.insertedId}")

在我检查日志后,insertedId变量始终返回0。它没有改变。可能出了什么问题?

最佳答案

View 模型中的 insert 方法正在启动一个新的协程,它在执行插入之前返回,因此您得到的初始值是 0。如果您等待作业完成,您将获取正确的 ID。

像这样更改它以查看正确的值:

var insertedId = 0L
fun insertItem(item: SingleItem) = viewModelScope.launch {
insertedId = myRepository.insertItem(item)
Log.i("INSERT_ID", "Inserted ID is: $insertedId")
}

如果您想在 fragment 中获取此值,则必须等待作业完成。最好的方法是让你的 View 模型 insert 方法成为一个 suspend 函数,而不是一劳永逸。

fun insertItem(item: SingleItem) = 
myRepository.insertItem(item)

在 fragment 中

lifecycleScope.launch {
val id = viewModel.insertItem(item)
Log.i("INSERT_ID", "Inserted ID is: $id")
}

但请注意,这是错误的架构,所有业务逻辑都应该位于 View 模型中,而不是 fragment 中。

关于android - 如何使用 android room (Kotlin) 返回新插入的项目(行)id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60919818/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com