Generierte ID nach dem Einfügen abrufen

138

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.

Marcos Vasconcelos
quelle

Antworten:

271

Die insertMethode gibt die idgerade eingefügte Zeile zurück oder -1wenn beim Einfügen ein Fehler aufgetreten ist.

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

wo db ist SQLiteDatabase.

GrAnd
quelle
21
Ich habe über Spezifikationen gelesen. "Rückgabe: Die Zeilen-ID der neu eingefügten Zeile oder -1, wenn ein Fehler aufgetreten ist." Die Zeilen-ID entspricht meinem generierten Feld "ID-Primärschlüssel-Autoinkrementierung".
Marcos Vasconcelos
29
Ja, es ist das gleiche.
GrAnd
3
@GrAnd, aber was ist, wenn ich einige "Start-Mitte" -Zeilen in meiner Tabelle lösche, so dass ich die Sequenz der n-ten Zeilen mit der generierten ID = n unterbreche. Bleibt diese zurückgegebene Zeilen-ID dieselbe wie die generierte Autoincrement-ID?
UnbekanntJoe
1
Was ist, wenn Sie INSERT OR UPDATE ausführen und die ID erhalten müssen?
Timo
1
@UnknownJoe Ich weiß, das ist ein alter Beitrag. Kann aber für jemanden hilfreich sein. Die Zeilen-ID und die automatisch inkrementierte ID sind auch dann identisch, wenn sie aus der Mitte gelöscht werden.
Raj kannan Iyyappan
8

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);
}
Ahmad Aghazadeh
quelle
5

Ich habe die Quellen überprüft. insertMethode Verwenden Sie die sqlite3_last_insert_rowidFunktion, 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 KEYwenn sie deklariert ist.

Jeder Eintrag in den meisten SQLite Tabellen ( mit Ausnahme der WITHOUT ROWIDTabellen) 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 _IDnormalerweise die Standardspalte

Kirill Akhmetov
quelle
1

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.

PHPDev
quelle
3
Dies setzt voraus, dass Ihre Spaltenwerte für jede Zeile eindeutig (oder größtenteils eindeutig) sind oder dass mehrere IDs zurückgegeben werden.
Richard Barker
0

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;

}
Rupesh Yadav
quelle