Obtenga la identificación generada después de la inserción

Estoy usando el SQLite con Android, y quiero saber la mejor manera de obtener el ID generado de la fila que inserté.

Una solución que creo que hace una búsqueda después de incluir, pero no se ve de la mejor manera.

El método insert devuelve el id de la fila que acaba de insertarse o -1 si hubo un error durante la inserción.

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

donde db es SQLiteDatabase .

Si usa 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 el exec de consulta usa 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 usas Habitación

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

Revisé las fonts. método de insert utiliza la función sqlite3_last_insert_rowid para devolver una identificación. De acuerdo con la documentación: https://www.sqlite.org/c3ref/last_insert_rowid.html La identificación de la fila es la columna oculta o una columna del tipo INTEGER PRIMARY KEY si se declara.

Entonces esa es la columna _ID predeterminada

Tuve un montón de problemas con esto en mySQL, LAST_INSERT_ID no es una forma confiable de obtener la ID, si tienes usuarios trabajando duro en la base de datos, la ID devuelta puede no ser la ID que insertó la consulta que has ejecutado, varios otros usuarios pueden afectar la devolución de esta identificación. Teníamos un servidor con un promedio de 7000 usuarios por minuto y siempre tropezaba.

La solución que teníamos era utilizar los datos de la consulta que había insertado, y luego buscar ese resultado usando esa información. Estás haciendo una solicitud buscando la última identificación de todos modos. Entonces, también podría hacer una ID SELECTA DE tabla donde campo = var y campo = var para obtener la identificación. Es un pequeño golpe de rendimiento en la consulta, pero se devuelve un resultado mucho más confiable.

Uno simplemente puede obtener la última fila insertada _id usando last_insert_rowid() . El código de muestra es el siguiente.

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