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.
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:
Il insert
metodo restituisce la id
riga della appena inserita o -1
se si è verificato un errore durante l'inserimento.
long id = db.insert(...);
dove è db SQLiteDatabase
.
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);
}
Ho controllato le fonti.
insert
Il metodo usa la sqlite3_last_insert_rowid
funzione 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 KEY
se viene dichiarata.
Ogni voce nella maggior parte delle tabelle SQLite (ad eccezione delle
WITHOUT ROWID
tabelle) 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 _ID
solito questa è la colonna predefinita
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.
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;
}