我正在用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,然后对该结果进行额外的处理。