根据 id 插入或更新 SQLite table

Inserting or updating SQLite table depending on id

我有一个像这样的 SQLite table:

CREATE TABLE test (id int PRIMARY KEY, Name text, Country text, ..., ...)

我正在获取此 table 的数据,可以更改列值,id 除外。所以,如果那里没有特定的 id,我想插入,但是,我想用新值 id 更新记录。

我试过这个:

INSERT OR IGNORE INTO test (id, Name, ..., ...) VALUES (?,?, ....)"

这不会创建重复的 id's - 这很好 - 但如果 id 已经存在于 table 中,它也不会更新记录的其余部分。

我想避免为 id 使用 SELECT 并检查它是否存在,然后相应地更新或插入。

您可以尝试使用INSERT OR REPLACE。这将首先尝试插入该行,如果与 id 发生冲突,它将删除旧行并再次尝试插入。

INSERT OR REPLACE 的缺点是您必须为每个 "upsert" 操作指定行的所有字段。如果这对您不起作用,那么唯一的选择是执行 SELECT,然后执行 INSERTUPDATE。您确实说过您不喜欢那样,但是在 sqlite 中,这并不像其他 RDBMS 那样糟糕; sqlite 是嵌入式 RDBMS 而不是客户端-服务器 RDBMS,因此与执行多个此类操作相关的成本要小得多。不要忘记将这两个操作包装在一个事务中。

您可以尝试UPDATE,如果没有实际更新记录,则执行INSERT:

ContentValues cv = new ContentValues();
cv.put("Name", ...);
if (db.update("test", cv, "id = " + myID, null) < 1) {
    cv.put("id", myID);
    db.insert("test", null, cv);
}