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 作为主键。 它在内存使用和性能方面都会更有效率