Używam SQLite z Androidem i chcę poznać najlepszy sposób uzyskania wygenerowanego identyfikatora wstawionego wiersza.
Myślę, że rozwiązanie polega na wyszukiwaniu po uwzględnieniu, ale nie wygląda to najlepiej.
Używam SQLite z Androidem i chcę poznać najlepszy sposób uzyskania wygenerowanego identyfikatora wstawionego wiersza.
Myślę, że rozwiązanie polega na wyszukiwaniu po uwzględnieniu, ale nie wygląda to najlepiej.
Odpowiedzi:
W insert
metoda zwraca id
z rzędu zaledwie włożona lub -1
czy nie wystąpił błąd podczas wprowadzania.
long id = db.insert(...);
gdzie jest db SQLiteDatabase
.
Jeśli używasz 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) ;
W przypadku wykonywania zapytania użyj 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);
Jeśli używasz Room
@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);
}
Sprawdziłem źródła.
insert
metoda użyj sqlite3_last_insert_rowid
funkcji, aby zwrócić identyfikator. Zgodnie z dokumentacją: https://www.sqlite.org/c3ref/last_insert_rowid.html
Identyfikator wiersza to ukryta kolumna lub kolumna typu, INTEGER PRIMARY KEY
jeśli jest zadeklarowana.
Każdy wpis w większości tabel SQLite (z wyjątkiem
WITHOUT ROWID
tabel) ma unikalny 64-bitowy klucz z liczbą całkowitą ze znakiem, zwany „ rowid ”. Rowid jest zawsze dostępny jako niezadeklarowana kolumna o nazwie ROWID, OID lub _ROWID_, o ile te nazwy nie są również używane przez jawnie zadeklarowane kolumny. Jeśli tabela ma kolumnę typu,INTEGER PRIMARY KEY
to ta kolumna jest innym aliasem dla identyfikatora wiersza .
Więc to jest _ID
zwykle kolumna domyślna
Miałem z tym sporo problemów na mySQL, LAST_INSERT_ID nie jest niezawodnym sposobem na uzyskanie identyfikatora, jeśli masz użytkowników łamiących bazę danych, zwracany identyfikator może nie być identyfikatorem wstawionym przez zapytanie, które wykonałeś, kilka inni użytkownicy mogą mieć wpływ na zwrot tego identyfikatora. Mieliśmy serwer ze średnio 7000 użytkownikami na minutę i zawsze się potykał.
Rozwiązaniem, które mieliśmy, było użycie danych z wstawionego zapytania, a następnie wyszukanie tego wyniku przy użyciu tych danych. I tak wykonujesz żądanie szukające ostatniego identyfikatora. Więc równie dobrze możesz zrobić tabelę SELECT id FROM, gdzie field = var i field = var, aby uzyskać identyfikator. Jest to niewielki spadek wydajności zapytania, ale zwrócono znacznie bardziej wiarygodny wynik.
Można po prostu pobrać ostatni wstawiony wiersz _id za pomocą last_insert_rowid()
. Przykładowy kod jest jak poniżej.
/**
* 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;
}