问题描述
我只是在学习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 = ?;
我希望将其更改为将saveColor
和deleteColorWithId
替换为:
updateColorWithId:
INSERT OR REPLACE INTO Color (id,hex)
WHERE id = ?
VALUES (?,?);
但不适用于此错误<insert stmt values real> expected,got 'WHERE'
有人可以帮忙吗?我在文档中找不到任何内容。
解决方法
您的语句saveColor
用作UPSERT命令,并且完全可以按照您的要求工作。您无需创建其他语句。
INSERT OR REPLACE INTO Color (id,name,hex)
VALUES (?,?,?);
您必须在PRIMARY KEY
列上指定id
,并且可以将saveColor
用作updateColorWithId
。
您已经在这里,尝试这样的事情:
检查记录是否存在。如果是这样,则进行更新,否则添加新行。根据文档使用命名的参数将是理想的。 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,hex)
VALUES (:id,:name,:hex);
END
用法
dbQuery.updateOrInsert(id = BGColor.id,name = bgColor.name,hex = bgColor.hex)
看看这可能有用REPLACE INTO vs Update