如何在安卓RoomDB应用程序中插入后获得自动生成的ID



我正在用MVVM架构构建一个Android应用程序。表A有一个"自动生成主键"列,它是表B的外键。当用户单击主片段上的按钮时,一行将插入表A。作为该按钮onClickListener的一部分,我希望在创建后检索"自动生成的主键"值(rowId(,并将其与更多数据一起插入表B的列中。

我正在使用MVVM体系结构、Coroutines等,但不知道如何做到这一点。下面是一些代码,如果有人能帮忙,我很乐意发布更多。

**// DAO Code**
@Dao
interface WLDAO {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertTableA(tableAEntry: TableAEntry) : Long
**// Repo Code (function only)**
suspend fun insertTableA(tableAEntry: TableAEntry): Long {
return WLDAO.insertTableA(TableAEntry)
}
**// View Model Code (function only)**
fun addToTableA(tableAEntry: TableAEntry) = viewModelScope.launch {
repo.insertTableA(TableAEntry)     
}

我想在创建后检索自动生成的主键值(rowId(,并将其与更多数据一起插入表B中的列中。

Room DAO的@Insert函数返回的Long是与该INSERT操作关联的行ID。

要在进一步的数据操作中使用该值,请在存储库或视图模型中进行处理。例如,您的存储库可能有以下内容:

suspend fun doStuffWithBothTables(tableAEntry: TableAEntry, stuffForTableB: Whatever): Long {
val rowID = WLDAO.insertTableA(TableAEntry)
// TODO use rowID and stuffForTableB for some other DAO operations
}

由于doStuffWithBothTables()本身就是一个suspend fun,所以可以正常调用其他suspend函数,就好像没有线程或任何相关的东西一样。因此,doStuffWithBothTables()可以从第一次插入中获取行ID,然后对该结果进行额外的处理。

最新更新