Отримати створений ідентифікатор після вставки


138

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

Я думаю, що рішення включає пошук після включення, але це виглядає не найкращим чином.

Відповіді:


271

У insertметоді повертає idз рядка просто вставляються або , -1якщо сталася помилка під час вставки.

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

де db SQLiteDatabase.


21
Я читав на специфікації. "Повертає: ідентифікатор рядка щойно вставленого рядка, або -1, якщо сталася помилка".
Marcos Vasconcelos

29
Так, це те саме.
GrAnd

3
@GrAnd, але що робити, якщо я видаляю кілька рядків "старт-середина" у своїй таблиці, тож я порушую послідовність n-х рядків з генерованим id = n. Чи залишиться цей ідентифікатор рядка таким же, як створений ідентифікатор автоматичного збільшення?
НевідомоJoe

1
Що робити, якщо вам потрібно ВСТАВИТИ АБО ОНОВЛЕННЯ та отримати ідентифікатор?
Тимо

1
@UnknownJoe Я знаю, що це стара публікація. Але хтось може бути корисним. Ідентифікатор рядка та ідентифікатор, що автоматично збільшується, будуть однаковими, навіть якщо його буде видалено із середини.
Raj kannan Iyyappan

8

Якщо використовувати 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);
}

5

Я перевірив джерела. 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зазвичай стовпець за замовчуванням


1

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

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


3
Це вимагає, щоб значення стовпців для кожного ряду були унікальними (або переважно унікальними) або ризикували повернути кілька ідентифікаторів.
Річард Баркер

0

Можна просто отримати останній вставлений рядок _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;

}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.