android - 我理解吗?错了吗?(更新或插入房间数据库时的主键错误)
问题描述
下面这个函数
进入 dictWord 如果它存在,它会在数据库中增加一个更新的数量属性并从 uiscope 返回 - 从函数中返回,当 getDictWord 返回 null 时,它会创建一个 newDictWord 并将其添加到数据库中并离开协程范围,然后是函数?
因为我不时得到“android.database.sqlite.SQLiteConstraintException:UNIQUE约束失败:DictWord.name(代码1555 SQLITE_CONSTRAINT_PRIMARYKEY)”
fun addOrIncreaseDictWordAmount(dictWord: String) {
uiScope.launch {
userDatabaseDao.getDictWord(dictWord)?.let {
it.amount += 1
userDatabaseDao.updateDictWord(it)
return@launch
}
// adds the strain to the AddNew dropDown list
val newDictWord = DictWord(name = dictWord)
userDatabaseDao.insertDictWord(newDictWord)
}
解决方案
关于您最初关于?.let
语法的问题......
此语法将使用可为空的值(在您的情况下返回 getDictWord(dictWord)。如果该值不为空,您将被传递到附加的块中,并且该值将作为 传递到块中it
,并保证不会 -闭包的其余部分为null。如果值为null,它将完全跳过该闭包。
至于您收到的间歇性错误,根据您提供的信息,我认为您的解决方案将与此处给出的答案有关:UNIQUE constraint failed
如果您能够提供更多涉及的日志和信息,我很乐意编辑和改进此答案以解决您的问题。
推荐阅读
- django - 天蓝色静态文件丢失/错误的 MIME
- c# - 如何使用 HttpClient 和 Task.WhenAll 避免 ThrowAddingDuplicateWithKeyArgumentException
- react-native - Google Play:使用来自不同国家/地区的设置测试应用内购买?
- python - 为什么 FastAPI 依赖项中产生的 SQLAlchemy 会话一旦超出范围就会关闭?
- c++ - 如何在 QQuickPaintedItem 项目周围绘制阴影?
- python - 如何找到单词的第一个和最后一个字母
- python - Flask & NextJS - CORS 不适用于 POST
- php - 如何在 sql select where 中使用字符串
- c# - 如何在 C# .NET 中保持 TCP 连接打开并执行多次写入/读取?
- spring-boot - 重置实体 ID - Spring Boot Kotlin