从SQLite中的INSERT OR IGNORE语句中查找自动增量值

时间:2010-09-25 16:39:09

标签: sql android sqlite

我有一张名为“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的最佳方法是什么。

1 个答案:

答案 0 :(得分:1)

在Android 2.2中,您可以使用SQLiteDatabse.insertWithOnConflictLink.

  

返回新的行ID   插入行或主键   输入参数的现有行   'conflictAlgorithm'= CONFLICT_IGNORE   如果有任何错误,则为-1,如果有任何错误,则为-1

在旧版本的SDK中,您可以:

  1. 查询条目是否存在
  2. 如果找到条目 - 返回所选项目的ID
  3. 如果找不到任何内容 - 使用SQLiteDatabse.insert插入条目(它将返回新项目的主键)。
  4. 如果需要,还可以考虑使用交易。