web-dev-qa-db-fra.com

Obtenir l'identifiant généré après l'insertion

J'utilise SQLite avec Android et je veux connaître le meilleur moyen d'obtenir l'id généré de la ligne que j'ai insérée.

Une solution qui, je pense, fait une recherche après l’inclusion, mais elle ne semble pas être la meilleure solution.

129
Marcos Vasconcelos

La méthode insert renvoie la id de la ligne qui vient d'être insérée ou -1 en cas d'erreur lors de l'insertion.

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

où db est SQLiteDatabase.

256
GrAnd

Si vous utilisez 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) ;

Si l'exécutif de la requête utilise 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);

Si utiliser la chambre

@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);
}
4
Ahmad Aghazadeh

J'ai vérifié les sources .insert méthode utiliser sqlite3_last_insert_rowid fonction pour renvoyer un identifiant . Selon la documentation: https://www.sqlite.org/c3ref/last_insert_rowid.html La rangée id est la colonne masquée ou une colonne de type INTEGER PRIMARY KEY si elle est déclarée.

Donc, c'est la colonne par défaut _ID habituellement

3
Kirill Akhmetov

J'ai eu pas mal de problèmes avec cela sur MySQL, le LAST_INSERT_ID n'est pas un moyen fiable d'obtenir l'ID, si vous avez des utilisateurs qui martèlent la base de données, l'ID renvoyé peut ne pas être celui qui a été inséré par la requête que vous avez exécutée, plusieurs d'autres utilisateurs peuvent avoir une incidence sur le retour de cet identifiant. Nous avions un serveur avec une moyenne de 7 000 utilisateurs à la minute et nous avons toujours trébuché.

Notre solution consistait à utiliser les données de la requête que vous avez insérée, puis à rechercher ce résultat à l'aide de ces données. Vous faites une demande pour la dernière identification de toute façon. Donc, vous pourriez aussi bien faire une table SELECT id FROM où field = var et field = var pour obtenir l'id. C'est une légère performance sur la requête, mais un résultat beaucoup plus fiable est retourné.

1
PHPDev

On peut simplement obtenir la dernière ligne insérée _id en utilisant last_insert_rowid(). Exemple de code est comme ci-dessous.

/**
 * 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;

}
0
Rupesh Yadav