我有一张名为“images”的表:
CREATE TABLE images (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
caption TEXT
);
在插入行时,我希望URL列是唯一的。同时,我想找出带有该URL的行的id。
INSERT OR IGNORE images (url, caption) VALUES ("http://stackoverflow.com", "A logo");
SELECT last_insert_rowid(); -- returns the id iff there was an insert.
当然,我想尽快做到这一点,尽管我的第一个想法是遵循以下伪代码:
int oldID = execSQL("SELECT last_insert_rowid()");
execSQL("INSERT OR IGNORE images (url, caption) VALUES ('http://stackoverflow.com', 'A logo')");
int newID = execSQL("SELECT last_insert_rowid()");
if (newID != oldID) {
// there was an insert.
return newID;
} else {
// we'd already seen this URL before
return execSQL("SELECT id FROM images WHERE url = 'http://stackoverflow.com'");
}
但这似乎无可救药地效率低下。
从INSERT或IGNORE语句中获取Auto递增的行ID的最佳方法是什么。
答案 0 :(得分:1)
在Android 2.2中,您可以使用SQLiteDatabse.insertWithOnConflict
。 Link.
返回新的行ID 插入行或主键 输入参数的现有行 'conflictAlgorithm'= CONFLICT_IGNORE 如果有任何错误,则为-1,如果有任何错误,则为-1
在旧版本的SDK中,您可以:
SQLiteDatabse.insert
插入条目(它将返回新项目的主键)。如果需要,还可以考虑使用交易。