Android ile SQLite kullanıyorum ve eklediğim satırın oluşturulan kimliği almak için en iyi yolu bilmek istiyorum.
Bence bir çözüm içerdikten sonra bir arama yapar, ama en iyi şekilde görünmüyor.
Android ile SQLite kullanıyorum ve eklediğim satırın oluşturulan kimliği almak için en iyi yolu bilmek istiyorum.
Bence bir çözüm içerdikten sonra bir arama yapar, ama en iyi şekilde görünmüyor.
Yanıtlar:
insert
Yöntem, döner id
sıranın eklenen veya -1
bir hata ekleme sırasında ise oldu.
long id = db.insert(...);
db olduğu yerde SQLiteDatabase
.
ContentValues kullanıyorsanız:
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) ;
Sorgu yürütme kullanılıyorsa 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);
Oda kullanıyorsanız
@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);
}
Kaynakları kontrol ettim.
insert
yöntem sqlite3_last_insert_rowid
bir id döndürmek için işlevini kullanın. Belgelere göre: https://www.sqlite.org/c3ref/last_insert_rowid.html
Satır kimliği, gizli sütun veya bildirildiğinde bir tür sütundur INTEGER PRIMARY KEY
.
Çoğu SQLite tablosundaki her giriş (tablolar hariç
WITHOUT ROWID
), " rowid " adı verilen benzersiz bir 64 bit imzalı tamsayı anahtarına sahiptir . Bu adlar açıkça bildirilen sütunlar tarafından kullanılmadığı sürece, rowid her zaman ROWID, OID veya _ROWID_ adında bildirilmemiş bir sütun olarak kullanılabilir. Tablonun türünde bir sütun varsa, bu sütun rowid için başka bir diğer addır .INTEGER PRIMARY KEY
Bu _ID
genellikle varsayılan sütun
Ben mySQL bu konuda biraz sorunları vardı, LAST_INSERT_ID kimliği almak için güvenilir bir yol değildir, eğer veritabanı çekiç kullanıcıları varsa, döndürülen kimlik çalıştırdığınız sorgu tarafından eklenen kimlik olmayabilir, birkaç diğer kullanıcılar bu kimliğin geri dönüşünü etkileyebilir. Bir dakika uzakta çekiç ortalama 7000 kullanıcılı sunucu vardı ve her zaman tökezledi.
Sahip olduğumuz çözüm, eklediğiniz sorgudaki verileri kullanmak ve ardından bu verileri kullanarak bu sonucu aramaktı. Yine de son kimliği arayan bir istekte bulunuyorsunuz. Böylece id almak için field = var ve field = var gibi bir SELECT id FROM tablosu da yapabilirsiniz. Sorgu üzerinde hafif bir performans isabet, ama çok daha güvenilir bir sonuç döndü.
Sadece kullanarak son eklenen satır _id alabilirsiniz last_insert_rowid()
. Örnek kod aşağıdaki gibidir.
/**
* 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;
}