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

js
add(value)
add(value, key)

Tham số

value

Giá trị cần lưu trữ.

key Optional

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:

ReadOnlyError DOMException

Được ném nếu giao dịch liên quan đến thao tác này đang ở chế độ chỉ đọc.

TransactionInactiveError DOMException

Được ném nếu giao dịch của IDBObjectStore này không hoạt động.

DataError DOMException

Đượ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ệ.
InvalidStateError DOMException

Được ném nếu IDBObjectStore đã bị xóa hoặc loại bỏ.

DataCloneError DOMException

Đượ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ộ.

ConstraintError DOMException

Đượ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).

js
// 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