IDBObjectStore: phương thức createIndex()

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 createIndex() của giao diện IDBObjectStore tạo và trả về một đối tượng IDBIndex mới trong cơ sở dữ liệu đã kết nối. Phương thức này tạo một trường/cột mới xác định một điểm dữ liệu mới mà mỗi bản ghi cơ sở dữ liệu sẽ chứa.

Lưu ý rằng các index của IndexedDB có thể chứa bất kỳ kiểu dữ liệu JavaScript nào; IndexedDB sử dụng thuật toán sao chép có cấu trúc để tuần tự hóa các đối tượng được lưu trữ, cho phép lưu trữ các đối tượng đơn giản và phức tạp.

Lưu ý rằng phương thức này chỉ được gọi từ callback của chế độ giao dịch VersionChange.

Cú pháp

js
createIndex(indexName, keyPath)
createIndex(indexName, keyPath, options)

Tham số

indexName

Tên của index cần tạo. Lưu ý rằng có thể tạo một index với tên rỗng.

keyPath

Đường dẫn khóa cho index sẽ sử dụng. Lưu ý rằng có thể tạo một index với keyPath rỗng, và cũng có thể truyền vào một chuỗi (mảng) làm keyPath.

options Optional

Một đối tượng có thể bao gồm các thuộc tính sau:

unique

Nếu là true, index sẽ không cho phép các giá trị trùng lặp cho một khóa duy nhất. Mặc định là false.

multiEntry

Nếu là true, index sẽ thêm một mục vào index cho mỗi phần tử mảng khi keyPath phân giải thành một mảng. Nếu là false, nó sẽ thêm một mục duy nhất chứa mảng đó. Mặc định là false.

locale Non-standard Deprecated

Cho phép bạn chỉ định một locale cho index. Mọi thao tác sắp xếp được thực hiện trên dữ liệu thông qua các phạm vi khóa sẽ tuân theo quy tắc sắp xếp của locale đó. Bạn có thể chỉ định giá trị của nó theo một trong ba cách:

  • string: Một chuỗi chứa mã locale cụ thể, ví dụ: en-US, hoặc pl.
  • auto: Locale mặc định của nền tảng sẽ được sử dụng (có thể bị thay đổi bởi cài đặt user agent).
  • null hoặc undefined: Nếu không chỉ định locale, sắp xếp JavaScript thông thường sẽ được sử dụng — không nhận biết locale.

Giá trị trả về

Một đối tượng IDBIndex: index mới được tạo.

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:

ConstraintError DOMException

Được ném nếu một index có cùng tên đã tồn tại trong cơ sở dữ liệu. Tên index có phân biệt hoa thường.

InvalidAccessError DOMException

Được ném nếu đường dẫn khóa được cung cấp là một chuỗi, và multiEntry được đặt thành true trong đối tượng objectParameters.

InvalidStateError DOMException

Được ném nếu:

  • Phương thức không được gọi từ callback của chế độ giao dịch versionchange, tức là từ bên trong trình xử lý onupgradeneeded.
  • Object store đã bị xóa.
SyntaxError DOMException

Được ném nếu keyPath được cung cấp không phải là một đường dẫn khóa hợp lệ.

TransactionInactiveError DOMException

Được ném nếu giao dịch mà IDBObjectStore này thuộc về không hoạt động (ví dụ: đã bị xóa hoặc loại bỏ.) Trong Firefox trước phiên bản 41, một InvalidStateError đã được ném trong trường hợp này, gây hiểu lầm; vấn đề này đã được sửa (xem Firefox bug 1176165.)

Ví dụ

Trong ví dụ sau, bạn có thể thấy trình xử lý onupgradeneeded được sử dụng để cập nhật cấu trúc cơ sở dữ liệu nếu một cơ sở dữ liệu với số phiên bản cao hơn được tải. createIndex() được sử dụng để tạo các index mới trên object store. Để 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
let db;

// Mở cơ sở dữ liệu
const DBOpenRequest = window.indexedDB.open("toDoList", 4);

// Hai trình xử lý sự kiện cho việc mở cơ sở dữ liệu.
DBOpenRequest.onerror = (event) => {
  note.appendChild(document.createElement("li")).textContent =
    "Error loading database.";
};

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 = request.result;

  // Chạy hàm displayData() để điền danh sách tác vụ với
  // tất cả dữ liệu danh sách việc cần làm đã có trong IDB
  displayData();
};

// Trình xử lý này được kích hoạt khi một cơ sở dữ liệu mới được tạo và cho biết
// rằng chưa từng tạo trước đó, hoặc một phiên bản mới
// đã được gửi với window.indexedDB.open(). (Xem ở trên.)
// Nó chỉ được triển khai trong các trình duyệt gần đây.
DBOpenRequest.onupgradeneeded = (event) => {
  const db = event.target.result;

  db.onerror = (event) => {
    note.appendChild(document.createElement("li")).textContent =
      "Error loading database.";
  };

  // Tạo một objectStore cho cơ sở dữ liệu này
  const objectStore = db.createObjectStore("toDoList", {
    keyPath: "taskTitle",
  });

  // xác định các mục dữ liệu mà objectStore sẽ chứa

  objectStore.createIndex("hours", "hours", { unique: false });
  objectStore.createIndex("minutes", "minutes", { unique: false });
  objectStore.createIndex("day", "day", { unique: false });
  objectStore.createIndex("month", "month", { unique: false });
  objectStore.createIndex("year", "year", { unique: false });
  objectStore.createIndex("notified", "notified", { unique: false });
};

Đặc tả kỹ thuật

Specification
Indexed Database API 3.0
# ref-for-dom-idbobjectstore-createindex①

Tương thích trình duyệt

Xem thêm