我有一个名为“图像”的表:
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 OR IGNORE 语句获取自动递增行 id 的最有效方法是什么。
在Android 2.2中你可以使用SQLiteDatabse.insertWithOnConflict
. Link. http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html
返回新的行 ID
插入的行或的主键
如果输入参数则存在行
'冲突算法' = CONFLICT_IGNORE
如果有任何错误,则为 -1;如果有错误,则为 -1
在旧版本的 SDK 中,您可以:
- 查询条目是否存在
- 如果找到条目 - 返回所选项目的 ID
- 如果没有找到 - 使用插入条目
SQLiteDatabse.insert
(它将返回新项目的主键)。
如果需要,还可以考虑使用事务。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)