使用 id 更新或添加值

Update or add value with id

我刚刚在学习 SQLDelight,希望找到如何添加带有 ID 的对象(如果它不存在)(如果它存在)然后使用给定的 ID 更新当前对象。

目前,我正在删除带有 id 的当前对象,然后添加一个对象,并希望将其简化为一个简单的调用。

我当前的代码:

CREATE TABLE Color (
  id TEXT NOT NULL,
  name TEXT NOT NULL,
  hex TEXT NOT NULL
);

getColorWithId:
SELECT * FROM Color
WHERE id = ?;

saveColor:
INSERT OR REPLACE INTO Color (id, name, hex)
VALUES (?, ?, ?);

deleteColorWithId:
DELETE FROM Color
WHERE id = ?;

我希望将其更改为用类似以下内容替换 saveColordeleteColorWithId

updateColorWithId:
INSERT OR REPLACE INTO Color (id, name, hex)
WHERE id = ?
VALUES (?, ?, ?);

但它不适用于此错误 <insert stmt values real> expected, got 'WHERE'

有人可以帮忙吗?我在文档中找不到任何内容。

你已经在那里了,尝试这样的事情:

检查记录是否存在。如果是,则更新,否则添加新行。根据文档使用命名参数是理想的。 https://cashapp.github.io/sqldelight/native_sqlite/query_arguments/

updateOrInsert:
IF EXISTS (SELECT 1 FROM Color WHERE id = :id) 
  BEGIN
    UPDATE Color
    SET id = :id, 
        name = :name, 
        hex = :hex
    WHERE id = :id 
  END
ELSE
  BEGIN
    INSERT INTO Color(id, name, hex)
    VALUES (:id, :name, :hex);
  END

用法

dbQuery.updateOrInsert(id = BGColor.id, name = bgColor.name, hex = bgColor.hex)

看看这个,可能会有用REPLACE INTO vs Update

您的语句 saveColor 用作 UPSERT 命令,它完全按照您的意愿工作。您不需要创建另一个语句。

INSERT OR REPLACE INTO Color (id, name, hex)
VALUES (?, ?, ?);

您必须在 id 列上指定 PRIMARY KEY,您可以将 saveColor 用作 updateColorWithId