Nhận id được tạo sau khi chèn


138

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:


271

Các insertphương pháp trả về idcủa hàng chỉ cần chèn hoặc -1nếu có một lỗi trong quá trình chèn.

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

trong đó db là SQLiteDatabase.


21
Tôi đọc trên thông số kỹ thuật. "Trả về: ID hàng của hàng vừa được chèn hoặc -1 nếu xảy ra lỗi" rowId giống với trường được tạo của tôi "tự động khóa chính id"?
Marcos Vasconcelos

29
Vâng, nó giống nhau.
GRAND

3
@GrAnd, nhưng nếu tôi xóa một số hàng "start-middle" trong bảng của mình, thì tôi sẽ phá vỡ chuỗi các hàng thứ n với id = n được tạo. ID hàng được trả lại đó có giữ nguyên như id tự động tạo không?
UnknownJoe

1
Điều gì sẽ xảy ra nếu bạn cần phải XÁC NHẬN HOẶC CẬP NHẬT và nhận id?
Timo

1
@Un UnknownJoe Tôi biết đây là bài viết cũ. Nhưng có thể hữu ích cho một ai đó. Id hàng và id tự động tăng sẽ giống nhau ngay cả khi nó bị xóa từ giữa.
Raj kannan Iyyappan

8

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

5

Tôi đã kiểm tra các nguồn. insertphương thức sử dụng sqlite3_last_insert_rowidhà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 KEYnếu được khai báo.

Mỗi mục trong hầu hết các bảng SQLite (ngoại trừ WITHOUT ROWIDcá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à _IDcột mặc định thường


1

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.


3
Điều này đòi hỏi các giá trị cột của bạn cho mỗi hàng là duy nhất (hoặc chủ yếu là duy nhất) hoặc có nguy cơ trả lại nhiều id.
Richard Barker

0

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;

}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.