0

我只是在学习 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'

谁能帮忙?我在文档中找不到任何内容。

4

2 回答 2

3

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

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

您必须PRIMARY KEYid列上指定,并且可以使用saveColoras updateColorWithId

于 2020-10-02T22:14:51.213 回答
0

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

检查记录是否存在。如果是,则更新,否则添加新行。根据文档使用命名参数将是理想的。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

于 2020-10-02T21:44:07.447 回答