Eklemeden sonra oluşturulan kimliği al


138

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:


271

insertYöntem, döner idsıranın eklenen veya -1bir hata ekleme sırasında ise oldu.

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

db olduğu yerde SQLiteDatabase.


21
Teknik özellikleri okudum. "İade: yeni eklenen satırın satır kimliği veya bir hata oluşursa -1" rowId oluşturulan alanım "id birincil anahtar autoincrement" ile aynı mı?
Marcos Vasconcelos

29
Evet, aynı.
GrAnd

3
@GrAnd, ancak tablomdaki bazı "başlangıç-orta" satırları silersem, oluşturulan id = n ile n-th satır sırasını kırarım. Bu döndürülen satır kimliği, oluşturulan otomatik görüntüleme kimliğiyle aynı mı kalacak?
UnknownJoe

1
INSERT VEYA UPDATE yapmanız ve kimliği almanız gerekiyorsa ne olur?
Timo

1
@Bilinmeyen bu eski yazı olduğunu biliyorum. Ancak birisi için yararlı olabilir. Satır kimliği ve otomatik artırılan kimlik, ortadan silinmiş olsa bile aynı olacaktır.
Raj kannan Iyyappan

8

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);
}

5

Kaynakları kontrol ettim. insertyöntem sqlite3_last_insert_rowidbir 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 _IDgenellikle varsayılan sütun


1

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ü.


3
Bu, her satır için sütun değerlerinizin benzersiz (veya çoğunlukla benzersiz) veya birden çok kimlik döndürme riski olmasını gerektirir.
Richard Barker

0

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;

}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.