如何在Kotlin中获得android房间数据库中插入行的id ?



我正在尝试从最新用户获取用户ID。当ID是自动生成的时,我如何使插入方法吐出ID ?

模型中

@PrimaryKey(autoGenerate = true)
val userId: Int

在Dao

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun addUserWithLong(user: User): LiveData<Long>

在库

fun addUserWitLong(user: User): LiveData<Long> {
return userDao.addUserWithLong(user)
}
在ViewModel

fun addUserWithLong(user: User): LiveData<Long> {
return repository.addUserWitLong(user)
}

片段中

val id: Long? = userViewModel.addUserWithLong(user).value

我在文档中读到@Insert返回长行ID,但我不知道如何编程。现在错误是"不确定如何处理插入方法返回类型"。是否有一些方法使与LiveData,而不是与Rxjava。这是不需要下载更多的依赖项。

根据这里的文档

如果@Insert方法接收到一个参数,它可以返回一个long值,它是插入项的新rowId。如果参数是数组或集合,则该方法应返回一个数组或长值的集合,每个值为插入项的rowId。了解更多关于回归的信息rowId值,请参见@Insert的参考文档注释,以及行表的SQLite文档

你可以用

@Insert(onConflict = OnConflictStrategy.REPLACE)
long addUserWithLong(user: User)

或者插入一个列表

@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] addUserWithLong(user: List<User>)

Edit-1

在检查了这个帖子的答案后。

不,你不能。我对这个问题写了一个答复。原因是LiveData用于通知更改。插入,更新,删除不会触发更改

我刚刚创建了一个测试项目,并成功接收到活动中最后插入项的Id。这是我的实现。

<<p>刀/strong>
@Insert
suspend fun addUser(user: Users): Long
回购
>
suspend fun insertUser(context: Context, users: Users): Long {
val db = AppDatabase.getInstance(context)
val dao = db.userDao()
return dao.addUser(users)
}

ViewModel

fun addUser(context: Context, users: Users) = liveData {
//you can also emit your customized object here. 
emit("Inserting...")
try {
val userRepo = UsersRepo()
val response = userRepo.insertUser(context, users)
emit(response)
} catch (e: Exception) {
e.printStackTrace()
emit(e.message)
}
}

viewModel.addUser(applicationContext, user).observe(this, Observer { userId ->
Log.d("MainActivity", "Inserted User Id is $userId")
})

点击此处查看测试应用。

最新更新