Ich verwende SQLite mit Android und möchte wissen, wie ich die generierte ID der von mir eingefügten Zeile am besten ermitteln kann.
Eine Lösung, von der ich denke, dass sie nach Include sucht, sieht aber nicht so gut aus.
Ich verwende SQLite mit Android und möchte wissen, wie ich die generierte ID der von mir eingefügten Zeile am besten ermitteln kann.
Eine Lösung, von der ich denke, dass sie nach Include sucht, sieht aber nicht so gut aus.
Antworten:
Die insert
Methode gibt die id
gerade eingefügte Zeile zurück oder -1
wenn beim Einfügen ein Fehler aufgetreten ist.
long id = db.insert(...);
wo db ist SQLiteDatabase
.
Wenn Sie ContentValues verwenden:
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) ;
Wenn Query Exec verwenden 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);
Wenn Raum verwenden
@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);
}
Ich habe die Quellen überprüft.
insert
Methode Verwenden Sie die sqlite3_last_insert_rowid
Funktion, um eine ID zurückzugeben. Gemäß der Dokumentation: https://www.sqlite.org/c3ref/last_insert_rowid.html
Die Zeilen-ID ist die ausgeblendete Spalte oder eine Spalte vom Typ, INTEGER PRIMARY KEY
wenn sie deklariert ist.
Jeder Eintrag in den meisten SQLite Tabellen ( mit Ausnahme der
WITHOUT ROWID
Tabellen) hat eine eindeutige 64-Bit - Integer unterzeichnet Schlüssel der „genannt Rowid “. Die Zeilen-ID ist immer als nicht deklarierte Spalte mit dem Namen ROWID, OID oder _ROWID_ verfügbar, solange diese Namen nicht auch von explizit deklarierten Spalten verwendet werden. Wenn die Tabelle eine Spalte vom TypINTEGER PRIMARY KEY
hat, ist diese Spalte ein weiterer Alias für die Zeilen-ID .
Das ist _ID
normalerweise die Standardspalte
Ich hatte unter mySQL einige Probleme damit. Die LAST_INSERT_ID ist kein zuverlässiger Weg, um die ID abzurufen. Wenn Benutzer die Datenbank hämmern, ist die zurückgegebene ID möglicherweise nicht die ID, die von der von Ihnen ausgeführten Abfrage eingefügt wurde Andere Benutzer können sich auf die Rückgabe dieser ID auswirken. Wir hatten einen Server mit durchschnittlich 7000 Benutzern pro Minute und er stolperte immer.
Die Lösung bestand darin, Daten aus der von Ihnen eingefügten Abfrage zu verwenden und dann anhand dieser Daten nach diesem Ergebnis zu suchen. Sie machen eine Anfrage und suchen trotzdem nach der letzten ID. Sie können also auch eine SELECT id FROM-Tabelle erstellen, in der field = var und field = var, um die ID abzurufen. Es ist ein leichter Leistungseinbruch bei der Abfrage, aber ein viel zuverlässigeres Ergebnis wird zurückgegeben.
Man kann einfach die zuletzt eingefügte Zeile _id mit abrufen last_insert_rowid()
. Der Beispielcode ist wie folgt.
/**
* 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;
}