Dapatkan id yang dihasilkan setelah dimasukkan

140

Saya menggunakan SQLite dengan Android, dan saya ingin tahu cara terbaik untuk mendapatkan id yang dihasilkan dari baris yang saya sisipkan.

Sebuah solusi yang menurut saya membuat pencarian setelah penyertaan, tetapi tidak terlihat sebagai cara terbaik.

Marcos Vasconcelos
sumber

Jawaban:

274

The insertkembali metode yang idbaris hanya dimasukkan atau -1jika ada kesalahan selama penyisipan.

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

dimana db berada SQLiteDatabase.

Agung
sumber
22
Saya membaca tentang spesifikasi. "Mengembalikan: ID baris dari baris yang baru disisipkan, atau -1 jika terjadi kesalahan" rowId sama dengan bidang yang saya buat "id primary key autoincrement"?
Marcos Vasconcelos
30
Ya, sama saja.
GrAnd
4
@GrAnd, tetapi bagaimana jika saya akan menghapus beberapa baris "mulai-tengah" di tabel saya, jadi saya memutus urutan baris ke-n dengan id = n yang dihasilkan. Apakah ID baris yang dikembalikan akan tetap sama dengan id autoincrement yang dihasilkan?
UnknownJoe
1
Bagaimana jika Anda perlu melakukan INSERT OR UPDATE dan mendapatkan id?
Timo
1
@UnknownJoe Saya tahu ini adalah posting lama. Tapi mungkin bisa membantu seseorang. Id baris dan id autoincrement akan sama meskipun dihapus dari tengah.
Raj kannan Iyyappan
9

Jika menggunakan 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) ;

Jika query exec menggunakan 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);

Jika menggunakan 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);
}
Ahmad Aghazadeh
sumber
6

Saya memeriksa sumbernya. insertmetode menggunakan sqlite3_last_insert_rowidfungsi untuk mengembalikan id. Menurut dokumentasi: https://www.sqlite.org/c3ref/last_insert_rowid.html Id baris adalah kolom tersembunyi atau kolom bertipe INTEGER PRIMARY KEYjika dideklarasikan.

Setiap entri di sebagian besar tabel SQLite (kecuali untuk WITHOUT ROWIDtabel) memiliki kunci integer bertanda tangan 64-bit unik yang disebut " rowid ". Rowid selalu tersedia sebagai kolom yang tidak dideklarasikan bernama ROWID, OID, atau _ROWID_ selama nama tersebut juga tidak digunakan oleh kolom yang dideklarasikan secara eksplisit. Jika tabel memiliki kolom bertipe maka kolom itu adalah alias lain untuk rowid .INTEGER PRIMARY KEY

Jadi itu _IDbiasanya kolom default

Kirill Akhmetov
sumber
1

Saya memiliki sedikit masalah dengan ini di mySQL, LAST_INSERT_ID bukan cara yang dapat diandalkan untuk mendapatkan ID, jika Anda memiliki pengguna yang memalu database, ID yang dikembalikan mungkin bukan ID yang dimasukkan oleh kueri yang Anda jalankan, beberapa pengguna lain mungkin berdampak pada kembalinya id ini. Kami memiliki server dengan rata-rata 7000 pengguna per menit dan selalu tersandung.

Solusi yang kami miliki adalah menggunakan data dari kueri yang Anda sisipkan, lalu mencari hasil tersebut menggunakan data tersebut. Anda tetap melakukan permintaan untuk mencari id terakhir. Jadi Anda sebaiknya melakukan tabel SELECT id FROM di mana field = var dan field = var untuk mendapatkan id. Ini adalah kinerja yang sedikit mengenai kueri, tetapi hasil yang jauh lebih dapat diandalkan dikembalikan.

PHPDev
sumber
3
Ini mengharuskan nilai kolom Anda untuk setiap baris unik (atau sebagian besar unik) atau berisiko mengembalikan beberapa id.
Richard Barker
0

Seseorang bisa dengan mudah memasukkan baris terakhir _id menggunakan last_insert_rowid(). Kode sampel adalah seperti di bawah ini.

/**
 * 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
sumber