问题描述
我想将对象列表插入我的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
是唯一的,并且是用来检查表中现有值的东西,则应该将其设为主键,而不是将当前用作主键的自动递增键键。
它将在内存使用和性能上更加高效