Получить сгенерированный идентификатор после вставки

113

Я использую SQLite с Android, и я хочу знать, как наилучшим образом получить сгенерированный идентификатор строки, которую я вставил.

Решение, которое, как я думаю, делает поиск после include, но выглядит не лучшим образом.

Теги:

4 ответа

240
Лучший ответ

Метод insert возвращает id только что вставленной строки или -1, если во время вставки была ошибка.

long id = db.insert(...);

где db SQLiteDatabase.

  • 19
    Я читаю на спецификации. «Возвращает: идентификатор строки вновь вставленной строки или -1, если произошла ошибка» идентификатор строки такой же, как у моего сгенерированного поля «автоинкремент первичного ключа идентификатора»?
  • 28
    Да, это то же самое.
Показать ещё 6 комментариев
3

Если используется ContentValues:

 DBHelper db =new DBHelper();// your dbHelper
 ContentValues values = new ContentValues();
 values.put("firstName","Ahmad");
 values.put("lastName","Aghazadeh");
 long insertedId= db.getSQLiteDatabase().insert("user", "", values) ;

Если запрос exec использует select last_insert_rowid()

String sql = "INSERT INTO [user](firstName,lastName) VALUES (\"Ahmad\",\"Aghazadeh\"); select last_insert_rowid()";
 DBHelper itemType =new DBHelper();// your dbHelper
 c = db.rawQuery(sql, null);
 if (c.moveToFirst())
    result = c.getLong(0);
3

Я проверил источники. insert использовать функцию sqlite3_last_insert_rowid для возврата идентификатора. Согласно документации: https://www.sqlite.org/c3ref/last_insert_rowid.html Идентификатор строки - это скрытый столбец или столбец типа INTEGER PRIMARY KEY, если он объявлен.

Итак, это столбец по умолчанию _ID обычно

1

У меня было довольно много проблем с этим на mySQL, LAST_INSERT_ID не является надежным способом получить идентификатор, если у вас есть пользователи, забивающие базу данных, возвращаемый идентификатор не может быть идентификатором, который был вставлен запросом, который у вас есть run, несколько других пользователей могут повлиять на возврат этого идентификатора. У нас был сервер со средним числом 7000 пользователей в минуту, и он всегда спотыкался.

Решение, которое мы имели, состояло в том, чтобы использовать данные из введенного вами запроса и затем искать этот результат с использованием этих данных. Вы все равно делаете запрос, ища последний идентификатор. Таким образом, вы можете также сделать таблицу SELECT id FROM, где field = var и field = var, чтобы получить идентификатор. Его небольшая производительность попала в запрос, но вернулся гораздо более надежный результат.

  • 2
    Для этого необходимо, чтобы значения столбцов для каждой строки были уникальными (или, в основном, уникальными), или существует риск возврата нескольких идентификаторов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню