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.
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.
Respuestas:
El insert
método devuelve la id
fila recién insertada 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 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);
}
Revisé las fuentes.
insert
El método utiliza la sqlite3_last_insert_rowid
funció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 KEY
si se declara.
Cada entrada en la mayoría de las tablas de SQLite (a excepción de
WITHOUT ROWID
las 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 _ID
columna predeterminada
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.
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;
}