Получить сгенерированный идентификатор после вставки - PullRequest
132 голосов
/ 23 марта 2011

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

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

Ответы [ 5 ]

261 голосов
/ 23 марта 2011

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

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

где db равно SQLiteDatabase.

4 голосов
/ 04 декабря 2016

Если использовать 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);
}
3 голосов
/ 29 мая 2016

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

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

1 голос
/ 29 мая 2016

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

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

0 голосов
/ 20 декабря 2017

Можно просто получить последнюю вставленную строку _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;

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