Android SQLITE:insertWithOnConflict() 重复插入
Android SQLITE: insertWithOnConflict() duplicates insertion
我想将对象列表插入到我的 SQLite 数据库中。如果我查询每个对象以检查它是否存在,那么长列表(20-30 秒)会花费很多时间。
我使用函数 'insertWithOnConflict()' 来更快地做到这一点。
我认为它会尝试插入一行,如果与输入函数的列具有相同值的记录已经存在,它只会替换它的值(如更新),否则它会插入新行。
但我检查了我的数据库,它正在创建重复的对象。有什么解决办法吗?
重要信息 '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
是唯一的,并且是您用来检查 table 中现有值的内容,您应该将其设为主键,而不是自动递增的主键使用 right now 作为主键。
它在内存使用和性能方面都会更有效率
我想将对象列表插入到我的 SQLite 数据库中。如果我查询每个对象以检查它是否存在,那么长列表(20-30 秒)会花费很多时间。
我使用函数 'insertWithOnConflict()' 来更快地做到这一点。
我认为它会尝试插入一行,如果与输入函数的列具有相同值的记录已经存在,它只会替换它的值(如更新),否则它会插入新行。
但我检查了我的数据库,它正在创建重复的对象。有什么解决办法吗?
重要信息 '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
是唯一的,并且是您用来检查 table 中现有值的内容,您应该将其设为主键,而不是自动递增的主键使用 right now 作为主键。
它在内存使用和性能方面都会更有效率