Tôi đang sử dụng SQLite với Android và tôi muốn biết cách tốt nhất để lấy id được tạo của hàng tôi đã chèn.
Một giải pháp tôi nghĩ thực hiện tìm kiếm sau khi bao gồm, nhưng nó không phải là cách tốt nhất.
Tôi đang sử dụng SQLite với Android và tôi muốn biết cách tốt nhất để lấy id được tạo của hàng tôi đã chèn.
Một giải pháp tôi nghĩ thực hiện tìm kiếm sau khi bao gồm, nhưng nó không phải là cách tốt nhất.
Câu trả lời:
Các insert
phương pháp trả về id
của hàng chỉ cần chèn hoặc -1
nếu có một lỗi trong quá trình chèn.
long id = db.insert(...);
trong đó db là SQLiteDatabase
.
Nếu sử dụng 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) ;
Nếu thực hiện truy vấn sử dụng 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);
Nếu sử dụng phòng
@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);
}
Tôi đã kiểm tra các nguồn.
insert
phương thức sử dụng sqlite3_last_insert_rowid
hàm để trả về một id. Theo tài liệu: https://www.sqlite.org/c3ref/last_insert_rowid.html
Id hàng là cột ẩn hoặc cột loại INTEGER PRIMARY KEY
nếu được khai báo.
Mỗi mục trong hầu hết các bảng SQLite (ngoại trừ
WITHOUT ROWID
các bảng) có một khóa nguyên có chữ ký 64 bit duy nhất được gọi là " rowid ". Rowid luôn có sẵn dưới dạng một cột không được khai báo có tên ROWID, OID hoặc _lawID_ miễn là các tên đó cũng không được sử dụng bởi các cột được khai báo rõ ràng. Nếu bảng có một cột kiểu thì cột đó là một bí danh khác cho rowid .INTEGER PRIMARY KEY
Vì vậy, đó là _ID
cột mặc định thường
Tôi đã gặp khá nhiều vấn đề với điều này trên myQuery, LAST_INSERT_ID không phải là cách đáng tin cậy để lấy ID, nếu bạn có người dùng làm hỏng cơ sở dữ liệu, ID được trả về có thể không phải là ID được chèn bởi truy vấn bạn đã chạy, một số những người dùng khác có thể ảnh hưởng đến sự trở lại của id này. Chúng tôi đã có máy chủ với trung bình 7000 người dùng một phút ngừng hoạt động và nó luôn bị vấp ngã.
Giải pháp chúng tôi có là sử dụng dữ liệu từ truy vấn bạn đã chèn và sau đó tìm kiếm kết quả đó bằng dữ liệu đó. Bạn đang thực hiện một yêu cầu tìm kiếm id cuối cùng. Vì vậy, bạn cũng có thể thực hiện một bảng CHỌN id TỪ trong đó trường = var và field = var để lấy id. Đó là một hiệu suất nhẹ đánh vào truy vấn, nhưng kết quả đáng tin cậy hơn nhiều đã được trả lại.
Người ta có thể chỉ cần lấy hàng được chèn cuối cùng bằng cách sử dụng last_insert_rowid()
. Mã mẫu như dưới đây.
/**
* 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;
}