Obter ID gerado após a inserção


138

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:


271

O insertmétodo retorna a idlinha of inserida ou -1se houve um erro durante a inserção.

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

onde db é SQLiteDatabase.


21
Eu li sobre especificações. "Retorna: o ID da linha recém-inserida ou -1 se ocorrer um erro" o rowId é igual ao meu campo gerado "id incremento automático da chave primária"?
Marcos Vasconcelos

29
Sim, é a mesma coisa.
GRAND

3
@ GrAnd, mas e se eu excluir algumas linhas "start-middle" da minha tabela, então eu quebro a sequência das n-ésimas linhas com o ID gerado = n. O ID da linha retornada permanecerá o mesmo que o ID de incremento automático gerado?
precisa saber é o seguinte

1
E se você precisar fazer INSERIR OU ATUALIZAR e obter o ID?
Timo

1
@UnknownJoe Eu sei que este é um post antigo. Mas pode ser útil para alguém. O ID da linha e o ID autoincrementado serão os mesmos, mesmo que sejam excluídos do meio.
Raj kannan Iyyappan

8

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

5

Eu verifiquei as fontes. insertO método use sqlite3_last_insert_rowidfunction 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 KEYse declarada.

Cada entrada na maioria das tabelas SQLite (exceto para WITHOUT ROWIDtabelas) 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 _IDcoluna padrão normalmente


1

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.


3
Isso exige que os valores de sua coluna para cada linha sejam únicos (ou principalmente únicos) ou corram o risco de retornar vários IDs.
Richard Barker

0

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;

}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.