Я використовую SQLite з Android, і хочу знати найкращий спосіб отримати згенерований ідентифікатор рядка, який я вставив.
Я думаю, що рішення включає пошук після включення, але це виглядає не найкращим чином.
Я використовую SQLite з Android, і хочу знати найкращий спосіб отримати згенерований ідентифікатор рядка, який я вставив.
Я думаю, що рішення включає пошук після включення, але це виглядає не найкращим чином.
Відповіді:
У 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);
Якщо використовувати номер
@Entity
class User {
@PrimaryKey(autoGenerate = true)
public int id;
//...
}
@Dao
public interface UserDao{
@Insert(onConflict = OnConflictStrategy.REPLACE)
long insert(User user);
// Insert multiple users
@Insert(onConflict = OnConflictStrategy.REPLACE)
long[] insert(User... user);
}
Я перевірив джерела.
insertметод використання sqlite3_last_insert_rowidфункції для повернення ідентифікатора. Відповідно до документації: https://www.sqlite.org/c3ref/last_insert_rowid.html
Ідентифікатор рядка - це прихований стовпець або стовпець типу, INTEGER PRIMARY KEYякщо він оголошений.
Кожен запис в більшості таблиць SQLite (за винятком
WITHOUT ROWIDтаблиць) має унікальний 64-розрядний ціле число ключа називається « ROWID ». Рідд завжди доступний як незадекларований стовпець з назвою ROWID, OID або _ROWID_, якщо ці імена також не використовуються в явно оголошених стовпцях. Якщо в таблиці є стовпець типу,INTEGER PRIMARY KEYто цей стовпець є іншим псевдонімом для рядка .
Так це _IDзазвичай стовпець за замовчуванням
У мене було досить багато проблем з цим на mySQL, LAST_INSERT_ID не є надійним способом отримання ідентифікатора, якщо у вас користувачі забивають базу даних, ідентифікатор, що повертається, не може бути ідентифікатором, який було вставлено за допомогою запущеного запиту, кілька інші користувачі можуть вплинути на повернення цього ідентифікатора. У нас був сервер із середнім показником 7000 користувачів за хвилину забивання, і він завжди спотикався.
Ми вирішили використати дані із введеного вами запиту, а потім шукати цей результат за допомогою цих даних. Ви все одно робите запит на пошук останнього ідентифікатора. Тож ви також можете зробити таблицю SELECT id FROM, де field = var і field = var, щоб отримати ідентифікатор. Його незначна ефективність потрапила в запит, але набагато надійніший результат повернувся.
Можна просто отримати останній вставлений рядок _id, використовуючи last_insert_rowid(). Зразок коду наведено нижче.
/**
* Return Last inserted row id(auto incremented row) (_id)
* @return
*/
public int getLastAddedRowId() {
String queryLastRowInserted = "select last_insert_rowid()";
final Cursor cursor = database.rawQuery(queryLastRowInserted, null);
int _idLastInsertedRow = 0;
if (cursor != null) {
try {
if (cursor.moveToFirst()) {
_idLastInsertedRow = cursor.getInt(0);
}
} finally {
cursor.close();
}
}
return _idLastInsertedRow;
}