Поиск автоинкрементных значений из оператора INSERT OR IGNORE в SQLite - PullRequest
2 голосов
/ 25 сентября 2010

У меня есть таблица с именем "images":

CREATE TABLE images (
    id      INTEGER PRIMARY KEY AUTOINCREMENT, 
    url     TEXT NOT NULL UNIQUE,
    caption TEXT
);

При вставке строки я бы хотел, чтобы столбец URL был уникальным.В то же время я хотел бы узнать идентификатор строки с этим URL.

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.

1 Ответ

1 голос
/ 28 сентября 2010

В Android 2.2 вы можете использовать SQLiteDatabse.insertWithOnConflict. Ссылка.

Возвращает идентификатор строки нового вставленная строка ИЛИ первичный ключ существующая строка, если входной параметр 'contactAlgorithm' = CONFLICT_IGNORE ИЛИ -1, если есть ошибка, ИЛИ -1, если есть ошибка

В старых версиях SDK вы можете:

  1. запрос, если запись существует
  2. Если запись найдена - вернуть идентификатор выбранного элемента
  3. Если ничего не найдено - введите запись, используя SQLiteDatabse.insert (он вернет первичный ключ нового элемента).

Также рассмотрите возможность использования транзакций, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...