Estou usando o SQLite com Android e quero saber a melhor maneira de obter o ID gerado da linha que inseri.
Uma solução que eu acho que faz uma pesquisa depois de incluir, mas não parece da melhor maneira.
Estou usando o SQLite com Android e quero saber a melhor maneira de obter o ID gerado da linha que inseri.
Uma solução que eu acho que faz uma pesquisa depois de incluir, mas não parece da melhor maneira.
Respostas:
O insert
método retorna a id
linha of inserida ou -1
se houve um erro durante a inserção.
long id = db.insert(...);
onde db é SQLiteDatabase
.
Se você usar 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) ;
Se o exec da consulta usar 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);
Se usar Sala
@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);
}
Eu verifiquei as fontes.
insert
O método use sqlite3_last_insert_rowid
function para retornar um ID. De acordo com a documentação: https://www.sqlite.org/c3ref/last_insert_rowid.html
O ID da linha é a coluna oculta ou uma coluna do tipo, INTEGER PRIMARY KEY
se declarada.
Cada entrada na maioria das tabelas SQLite (exceto para
WITHOUT ROWID
tabelas) tem um único 64-bit inteiro assinado chave chamada " rowid ". O rowid está sempre disponível como uma coluna não declarada denominada ROWID, OID ou _ROWID_, desde que esses nomes também não sejam usados por colunas declaradas explicitamente. Se a tabela tiver uma coluna do tipoINTEGER PRIMARY KEY
, essa coluna será outro alias para o rowid .
Então essa é a _ID
coluna padrão normalmente
Eu tive alguns problemas com isso no mySQL, o LAST_INSERT_ID não é uma maneira confiável de obter o ID. Se você tem usuários martelando o banco de dados, o ID retornado pode não ser o ID inserido pela consulta que você executou, vários outros usuários podem afetar o retorno desse ID. Tínhamos um servidor com média de 7.000 usuários por minuto martelando e ele sempre tropeçava.
A solução que tivemos foi usar dados da consulta inserida e, em seguida, procurar esse resultado usando esses dados. Você está solicitando a última identificação de qualquer maneira. Portanto, você também pode criar uma tabela SELECT id FROM em que field = var e field = var para obter o id. É um leve impacto na consulta, mas um resultado muito mais confiável é retornado.
Pode-se simplesmente obter a última linha inserida _id usando last_insert_rowid()
. O código de exemplo é como abaixo.
/**
* 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;
}