IDBObjectStore: phương thức add()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.
Note: This feature is available in Web Workers.
Phương thức add() của giao diện IDBObjectStore trả về một đối tượng IDBRequest, và, trong một luồng riêng biệt, tạo một bản sao có cấu trúc của giá trị, sau đó lưu giá trị đã sao chép vào object store. Phương thức này dùng để thêm bản ghi mới vào object store.
Để xác định xem thao tác thêm đã hoàn tất thành công hay chưa, hãy lắng nghe sự kiện complete của giao dịch bên cạnh sự kiện success của yêu cầu IDBObjectStore.add, vì giao dịch vẫn có thể thất bại sau khi sự kiện success được kích hoạt. Nói cách khác, sự kiện success chỉ được kích hoạt khi giao dịch đã được xếp hàng thành công.
Phương thức add là phương thức chỉ chèn. Nếu một bản ghi đã tồn tại trong object store với tham số key làm khóa của nó, thì một lỗi ConstraintError sẽ được kích hoạt trên đối tượng request được trả về. Để cập nhật các bản ghi hiện có, bạn nên sử dụng phương thức IDBObjectStore.put thay thế.
Cú pháp
add(value)
add(value, key)
Tham số
value-
Giá trị cần lưu trữ.
keyOptional-
Khóa dùng để xác định bản ghi. Nếu không được chỉ định, kết quả sẽ là null.
Giá trị trả về
Một đối tượng IDBRequest mà các sự kiện tiếp theo liên quan đến thao tác này sẽ được kích hoạt trên đó.
Nếu thao tác thành công, giá trị của thuộc tính result của request là khóa của bản ghi mới.
Ngoại lệ
Phương thức này có thể gây ra một DOMException thuộc một trong các loại sau:
ReadOnlyErrorDOMException-
Được ném nếu giao dịch liên quan đến thao tác này đang ở chế độ chỉ đọc.
TransactionInactiveErrorDOMException-
Được ném nếu giao dịch của
IDBObjectStorenày không hoạt động. DataErrorDOMException-
Được ném nếu bất kỳ điều kiện nào sau đây áp dụng:
- Object store sử dụng khóa nội tuyến hoặc có bộ tạo khóa, và tham số key đã được cung cấp.
- Object store sử dụng khóa ngoại tuyến và không có bộ tạo khóa, và không có tham số key nào được cung cấp.
- Object store sử dụng khóa nội tuyến nhưng không có bộ tạo khóa, và đường dẫn khóa của object store không tạo ra một khóa hợp lệ.
- Tham số key đã được cung cấp nhưng không chứa một khóa hợp lệ.
InvalidStateErrorDOMException-
Được ném nếu
IDBObjectStoređã bị xóa hoặc loại bỏ. DataCloneErrorDOMException-
Được ném nếu dữ liệu đang được lưu trữ không thể được sao chép bởi thuật toán sao chép có cấu trúc nội bộ.
ConstraintErrorDOMException-
Được ném nếu thao tác chèn thất bại do vi phạm ràng buộc khóa chính (do đã tồn tại bản ghi có cùng giá trị khóa chính).
Ví dụ
Trong đoạn mã sau, chúng ta mở một giao dịch read/write trên cơ sở dữ liệu và thêm một số dữ liệu vào object store bằng add(). Lưu ý các hàm được gắn vào các trình xử lý sự kiện giao dịch để báo cáo kết quả của việc mở giao dịch trong trường hợp thành công hoặc thất bại. Để xem ví dụ hoạt động đầy đủ, hãy tham khảo ứng dụng To-do Notifications của chúng tôi (xem ví dụ trực tiếp).
// Mở cơ sở dữ liệu
const DBOpenRequest = window.indexedDB.open("toDoList", 4);
DBOpenRequest.onsuccess = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Database initialized.";
// Lưu kết quả mở cơ sở dữ liệu vào biến db.
// Biến này được sử dụng nhiều ở dưới
db = DBOpenRequest.result;
// Chạy hàm addData() để thêm dữ liệu vào cơ sở dữ liệu
addData();
};
function addData() {
// Tạo một đối tượng mới sẵn sàng chèn vào IDB
const newItem = [
{
taskTitle: "Walk dog",
hours: 19,
minutes: 30,
day: 24,
month: "December",
year: 2013,
notified: "no",
},
];
// mở một giao dịch db read/write, sẵn sàng để thêm dữ liệu
const transaction = db.transaction(["toDoList"], "readwrite");
// báo cáo về việc giao dịch hoàn tất thành công
transaction.oncomplete = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Transaction completed.";
};
transaction.onerror = (event) => {
note.appendChild(document.createElement("li")).textContent =
"Transaction not opened due to error. Duplicate items not allowed.";
};
// tạo một object store trên giao dịch
const objectStore = transaction.objectStore("toDoList");
// Gửi yêu cầu thêm đối tượng newItem vào object store
const objectStoreRequest = objectStore.add(newItem[0]);
objectStoreRequest.onsuccess = (event) => {
// báo cáo sự thành công của yêu cầu
note.appendChild(document.createElement("li")).textContent =
"Request successful.";
};
}
Đặc tả kỹ thuật
| Specification |
|---|
| Indexed Database API 3.0> # ref-for-dom-idbobjectstore-add①> |
Tương thích trình duyệt
Xem thêm
- Sử dụng IndexedDB
- Bắt đầu giao dịch:
IDBDatabase - Sử dụng giao dịch:
IDBTransaction - Thiết lập phạm vi khóa:
IDBKeyRange - Truy xuất và thay đổi dữ liệu của bạn:
IDBObjectStore - Sử dụng con trỏ:
IDBCursor - Ví dụ tham khảo: To-do Notifications (Xem ví dụ trực tiếp).