Tôi có một bảng SQLite:Tại sao insertWithOnConflict (..., CONFLICT_IGNORE) trả lại -1 (lỗi)?
CREATE TABLE regions (_id INTEGER PRIMARY KEY, name TEXT, UNIQUE(name));
Và một số mã Android:
Validate.notBlank(region);
ContentValues cv = new ContentValues();
cv.put(Columns.REGION_NAME, region);
long regionId =
db.insertWithOnConflict("regions", null, cv, SQLiteDatabase.CONFLICT_IGNORE);
Validate.isTrue(regionId > -1,
"INSERT ON CONFLICT IGNORE returned -1 for region name '%s'", region);
Mở hàng trùng lặp insertWithOnConflict() được trở về -1, chỉ ra một lỗi, và Validate sau đó ném với:
INSERT ON CONFLICT IGNORE returned -1 for region name 'Overseas'
SQLite ON CONFLICT documentation (phần nhấn mạnh của tôi) nêu rõ:
Khi xảy ra vi phạm ràng buộc áp dụng, thuật toán phân giải IGNORE bỏ qua hàng có chứa vi phạm ràng buộc và tiếp tục xử lý các hàng tiếp theo của câu lệnh SQL như thể không có gì sai. Các hàng khác trước và sau hàng có chứa vi phạm ràng buộc được chèn hoặc cập nhật bình thường. Không có lỗi nào được trả về khi thuật toán giải quyết xung đột IGNORE được sử dụng.
Các Android insertWithOnConflict() documentation trạng thái:
Returns hàng ID của hàng mới được chèn HOẶC khóa chính của hàng hiện tại nếu các param đầu vào 'conflictAlgorithm' = CONFLICT_IGNORE OR -1 nếu có lỗi
CONFLICT_REPLACE không phải là một lựa chọn, bởi vì hàng thay thế sẽ thay đổi khóa chính của họ thay vì chỉ trả lại chìa khóa hiện có:
sqlite> INSERT INTO regions (name) VALUES ("Southern");
sqlite> INSERT INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
2|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
3|Overseas
sqlite> INSERT OR REPLACE INTO regions (name) VALUES ("Overseas");
sqlite> SELECT * FROM regions;
1|Southern
4|Overseas
Tôi nghĩ rằng insertWithOnConflict() nên, trên các hàng trùng lặp, trả lại cho tôi chìa khóa chính (cột _id) của hàng trùng lặp — vì vậy tôi nên không bao giờ nhận được một lỗi cho chèn này. Tại sao insertWithOnConflict() ném một lỗi? Tôi cần gọi hàm nào để tôi luôn nhận được ID hàng hợp lệ?
Kiểm tra LogCat của bạn. Vì bạn đang nhận được một mã lỗi, bạn sẽ thấy một số cảnh báo từ SQLite. – Sam
OK, không phải vậy - Tôi đã sửa lỗi "không có khóa cơ sở dữ liệu!", Nhưng tôi vẫn gặp lỗi. Ảnh chụp màn hình nhật ký tại http://i.imgur.com/KIlWH.png. – George