Obtener ID generada después de insertar

138

Estoy usando el SQLite con Android, y quiero saber la mejor manera de obtener la identificación generada 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.

Marcos Vasconcelos
fuente

Respuestas:

271

El insertmétodo devuelve la idfila recién insertada o -1si hubo un error durante la inserción.

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

donde db es SQLiteDatabase.

Grandioso
fuente
21
Leí en las especificaciones. "Devuelve: el ID de fila de la fila recién insertada, o -1 si se produjo un error" ¿el rowId es el mismo que mi campo generado "id autoincrement de clave primaria"?
Marcos Vasconcelos
29
Si, es lo mismo.
GrAnd
3
@GrAnd, pero ¿qué pasa si elimino algunas filas "inicio-medio" en mi tabla, así que rompo la secuencia de n-ésimas filas con id = n generado. ¿La ID de fila devuelta seguirá siendo la misma que la ID de incremento automático generada?
Desconocido Joe el
1
¿Qué sucede si necesita hacer INSERTAR O ACTUALIZAR y obtener la identificación?
Timo
1
@UnknownJoe Sé que esta es una publicación anterior. Pero puede ser útil para alguien. El ID de fila y el ID autoincrementado serán los mismos, incluso si se eliminan del medio.
Raj kannan Iyyappan
8

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 usa la 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);
}
Ahmad Aghazadeh
fuente
5

Revisé las fuentes. insertEl método utiliza la sqlite3_last_insert_rowidfunción para devolver una identificación. De acuerdo con la documentación: https://www.sqlite.org/c3ref/last_insert_rowid.html El ID de la fila es la columna oculta o una columna de tipo INTEGER PRIMARY KEYsi se declara.

Cada entrada en la mayoría de las tablas de SQLite (a excepción de WITHOUT ROWIDlas tablas) tiene una única de 64 bits entero de clave llamado el " rowid ". El rowid siempre está disponible como una columna no declarada llamada ROWID, OID o _ROWID_ siempre que esos nombres no sean utilizados también por columnas declaradas explícitamente. Si la tabla tiene una columna de tipoINTEGER PRIMARY KEY , esa columna es otro alias para el rowid .

Por lo general, esa es la _IDcolumna predeterminada

Kirill Akhmetov
fuente
1

Tuve bastantes problemas con esto en mySQL, LAST_INSERT_ID no es una forma confiable de obtener la ID, si tiene usuarios que manipulan la base de datos, la ID devuelta puede no ser la ID que fue insertada por la consulta que ha ejecutado, varios otros usuarios pueden afectar el regreso 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 insertó y luego buscar ese resultado utilizando esos datos. Estás haciendo una solicitud buscando la última identificación de todos modos. Por lo tanto, también puede hacer una tabla SELECT id FROM donde field = var y field = var para obtener la identificación. Es un pequeño golpe de rendimiento en la consulta, pero se obtuvo un resultado mucho más confiable.

PHPDev
fuente
3
Esto requiere que sus valores de columna para cada fila sean únicos (o en su mayoría únicos) o corran el riesgo de devolver múltiples identificadores.
Richard Barker
0

Simplemente se 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;

}
Rupesh Yadav
fuente