Android SQLITE:insertWithOnConflict复制插入

问题描述

我想将对象列表插入我的SQLite数据库。如果我确实查询每个对象以检查其是否存在,则较长的时间(20-30秒)会花费很多时间。

我使用函数'insertWithOnConflict()'可以更快地完成该任务。

我认为它将尝试插入行,如果已经存在与输入函数相同的列值的记录,则将替换其值(如update),否则将插入新行。

但是我检查了数据库,它正在创建重复的对象。有什么解决办法吗? 重要信息'COLUMN_OBJECT_ID'不是'PRIMARY_KEY''PRIMARY_KEY'是自动递增。但是'COLUMN_OBJECT_ID'在这种情况下必须唯一。因此,我想使用相同的'COLUMN_OBJECT_ID'更新行,因为其中的数据可以更改。

代码:

fun saveObjectsToCache(objects: List<Item>) {
        val db = getDb()
        db.transaction {
            objects.forEach {item->
                val cv = ContentValues()
                cv.apply {
                    put(COLUMN_OBJECT_ID,item.id)
                    put(COLUMN_OBJECT_DATA,item.js.toString())
                }
                insertWithOnConflict(TABLE_OBJECT_CACHE,COLUMN_OBJECT_ID,cv,SQLiteDatabase.CONFLICT_REPLACE)
            }
        }
    }

解决方法

好像您忘记在COLUMN_OBJECT_ID上添加唯一约束。 因此,在添加具有相同COLUMN_OBJECT_ID的行时不会发生冲突。

使COLUMN_OBJECT_ID唯一,它应该可以工作。

另外,如果COLUMN_OBJECT_ID是唯一的,并且是用来检查表中现有值的东西,则应该将其设为主键,而不是将当前用作主键的自动递增键键。 它将在内存使用和性能上更加高效

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...