我有一个像这样的SQLite表:
CREATE TABLE test (id int PRIMARY KEY, Name text, Country text, ..., ...)
我正在获取此表的数据,可以更改列值,id
除外。所以,如果那里没有特定的id
,我想插入,但是,我想用id
更新带有新值的记录。
我试过这个:
INSERT OR IGNORE INTO test (id, Name, ..., ...) VALUES (?,?, ....)"
这不会创建重复的id's
- 这很好 - 但如果表中已存在id
,则它不会更新记录的其余部分。
我希望避免对SELECT
使用id
并检查它是否存在,然后相应地更新或插入。
答案 0 :(得分:1)
您可以尝试使用INSERT OR REPLACE
。这将首先尝试插入行,如果与id
发生冲突,它将删除旧行并再次尝试插入。
INSERT OR REPLACE
的缺点是你必须为每个" upsert"指定行的所有字段。操作。如果这对您不起作用,那么唯一的选择是SELECT
后跟INSERT
或UPDATE
。你确实说过你不喜欢这样,但在sqlite中,这并不像其他RDBMS那么糟糕; sqlite是嵌入式RDBMS而不是客户端 - 服务器RDBMS,因此与执行多个此类操作相关的成本要小得多。不要忘记在事务中包装这两个操作。
答案 1 :(得分:1)
您可以尝试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);
}