Ottieni l'ID generato dopo l'inserimento


138

Sto usando SQLite con Android e voglio conoscere il modo migliore per ottenere l'ID generato della riga che ho inserito.

Una soluzione che credo possa includere una ricerca dopo, ma non sembra il modo migliore.

Risposte:


271

Il insertmetodo restituisce la idriga della appena inserita o -1se si è verificato un errore durante l'inserimento.

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

dove è db SQLiteDatabase.


21
Ho letto le specifiche. "Restituisce: l'ID riga della riga appena inserita, oppure -1 se si è verificato un errore" rowId è uguale al mio campo generato "autoincremento chiave primaria id"?
Marcos Vasconcelos,

29
Sì, è lo stesso.
Gr

3
@GrAnd, ma cosa succede se eliminerò alcune righe "start-middle" nella mia tabella, quindi interrompo la sequenza di n-esima riga con id generato = n. L'ID riga restituito rimarrà lo stesso dell'ID di incremento automatico generato?
UnknownJoe

1
Cosa succede se è necessario eseguire INSERT O UPDATE e ottenere l'id?
Timo,

1
@UnnownJoe So che questo è un vecchio post. Ma può essere utile per qualcuno. L'ID riga e l'ID autoincremento saranno uguali anche se vengono eliminati dal centro.
Raj Kannan Iyyappan,

8

Se usi 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 query exec 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);

Se usi la stanza

@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

Ho controllato le fonti. insertIl metodo usa la sqlite3_last_insert_rowidfunzione per restituire un ID. Secondo la documentazione: https://www.sqlite.org/c3ref/last_insert_rowid.html L'ID riga è la colonna nascosta o una colonna di tipo INTEGER PRIMARY KEYse viene dichiarata.

Ogni voce nella maggior parte delle tabelle SQLite (ad eccezione delle WITHOUT ROWIDtabelle) ha una chiave intera con segno a 64 bit univoca chiamata " rowid ". Il rowid è sempre disponibile come colonna non dichiarata denominata ROWID, OID o _ROWID_ purché tali nomi non vengano utilizzati anche da colonne dichiarate esplicitamente. Se la tabella ha una colonna di tipo, quella colonna è un altro alias per il rowid .INTEGER PRIMARY KEY

Di _IDsolito questa è la colonna predefinita


1

Ho avuto un bel po 'di problemi con questo su mySQL, il LAST_INSERT_ID non è un modo affidabile per ottenere l'ID, se hai utenti che martellano il database, l'ID restituito potrebbe non essere l'ID che è stato inserito dalla query che hai eseguito, diversi altri utenti potrebbero influire sul ritorno di questo ID. Avevamo un server con una media di 7000 utenti al minuto che martellava e inciampava sempre.

La soluzione che abbiamo avuto è stata quella di utilizzare i dati della query inserita e quindi cercare quel risultato utilizzando quei dati. Stai comunque facendo una richiesta di ricerca dell'ultimo ID. Quindi potresti anche fare una tabella SELECT id FROM dove field = var e field = var per ottenere l'id. È un leggero calo delle prestazioni sulla query, ma viene restituito un risultato molto più affidabile.


3
Ciò richiede che i valori delle colonne per ogni riga siano univoci (o principalmente unici) o rischino di restituire più ID.
Richard Barker,

0

Si può semplicemente ottenere l'ultima riga _id inserita usando last_insert_rowid(). Il codice di esempio è il seguente.

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

}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.