Я использую SQLite с Android, и я хочу знать, как наилучшим образом получить сгенерированный идентификатор строки, которую я вставил.
Решение, которое, как я думаю, делает поиск после include, но выглядит не лучшим образом.
Метод insert
возвращает id
только что вставленной строки или -1
, если во время вставки была ошибка.
long id = db.insert(...);
где db SQLiteDatabase
.
Если используется 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);
Я проверил источники.
insert
использовать функцию sqlite3_last_insert_rowid
для возврата идентификатора.
Согласно документации: https://www.sqlite.org/c3ref/last_insert_rowid.html
Идентификатор строки - это скрытый столбец или столбец типа INTEGER PRIMARY KEY
, если он объявлен.
Итак, это столбец по умолчанию _ID
обычно
У меня было довольно много проблем с этим на mySQL, LAST_INSERT_ID не является надежным способом получить идентификатор, если у вас есть пользователи, забивающие базу данных, возвращаемый идентификатор не может быть идентификатором, который был вставлен запросом, который у вас есть run, несколько других пользователей могут повлиять на возврат этого идентификатора. У нас был сервер со средним числом 7000 пользователей в минуту, и он всегда спотыкался.
Решение, которое мы имели, состояло в том, чтобы использовать данные из введенного вами запроса и затем искать этот результат с использованием этих данных. Вы все равно делаете запрос, ища последний идентификатор. Таким образом, вы можете также сделать таблицу SELECT id FROM, где field = var и field = var, чтобы получить идентификатор. Его небольшая производительность попала в запрос, но вернулся гораздо более надежный результат.