IDBIndex

Baseline 廣泛可用 *

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2015 年 7 月⁩以來,各瀏覽器均已提供此特性。

* 此特性的某些部分可能存在不同級別的支援。

注意:此功能在 Web Workers 中可用。

IDBIndex 介面(位於 IndexedDB API 中)提供對資料庫中 索引的非同步訪問。索引是一種物件儲存,用於查詢另一個名為“所引用物件儲存”的物件儲存中的記錄。您可以使用此介面檢索資料。

您可以透過主鍵或使用索引來檢索物件儲存中的記錄。索引允許您使用物件儲存記錄中除主鍵以外的其他屬性來查詢記錄。

索引是一種持久化的鍵值儲存,其中其記錄的值部分是所引用物件儲存中記錄的鍵部分。當所引用物件儲存中的記錄被插入、更新或刪除時,索引中的記錄會自動填充。索引中的每條記錄只能指向其所引用物件儲存中的一條記錄,但多個索引可以引用同一個物件儲存。當物件儲存發生更改時,所有引用該物件儲存的索引都會自動更新。

您可以獲取一個範圍內的鍵集。有關更多資訊,請參閱 IDBKeyRange

例項屬性

IDBIndex.isAutoLocale 只讀 非標準 已棄用

返回一個布林值,指示在建立索引時是否指定了 autolocale 值(參見 IDBObjectStore.createIndex()options 引數)。

IDBIndex.locale 只讀 非標準 已棄用

返回索引的 locale(例如 en-USpl),前提是在建立索引時指定了 locale 值(參見 IDBObjectStore.createIndex()options 引數)。

IDBIndex.name

此索引的名稱。

IDBIndex.objectStore 只讀

此索引所引用的物件儲存的名稱。

IDBIndex.keyPath 只讀

此索引的 鍵路徑。如果為 null,則此索引不是自動填充的。

IDBIndex.multiEntry 只讀

當評估索引的鍵路徑的結果產生一個數組時,此屬性會影響索引的行為。如果為 true,則索引中每項陣列元素都會有一條記錄。如果為 false,則每項陣列鍵值都會有一條記錄。

IDBIndex.unique 只讀

如果為 true,則此索引不允許鍵具有重複值。

例項方法

繼承自:EventTarget

IDBIndex.count()

返回一個 IDBRequest 物件,並在單獨的執行緒中返回鍵範圍內記錄的數量。

IDBIndex.get()

返回一個 IDBRequest 物件,並在單獨的執行緒中查詢所引用物件儲存中與給定鍵對應的條目,或者如果 key 是一個 IDBKeyRange,則查詢第一個匹配的條目。

IDBIndex.getKey()

返回一個 IDBRequest 物件,並在單獨的執行緒中查詢給定鍵,或者如果 key 是一個 IDBKeyRange,則查詢主鍵。

IDBIndex.getAll()

返回一個 IDBRequest 物件,並在單獨的執行緒中查詢所引用物件儲存中與給定鍵匹配的所有值,或者如果 key 是一個 IDBKeyRange,則查詢範圍內的所有匹配值。

IDBIndex.getAllKeys()

返回一個 IDBRequest 物件,並在單獨的執行緒中查詢所引用物件儲存中與給定鍵匹配的所有鍵,或者如果 key 是一個 IDBKeyRange,則查詢範圍內的所有匹配鍵。

IDBIndex.openCursor()

返回一個 IDBRequest 物件,並在單獨的執行緒中為指定的鍵範圍建立 遊標

IDBIndex.openKeyCursor()

返回一個 IDBRequest 物件,並在單獨的執行緒中為指定的鍵範圍建立遊標,該範圍按此索引進行排序。

示例

在以下示例中,我們打開了一個事務和一個物件儲存,然後從一個簡單的聯絡人資料庫中獲取了索引 lName。然後,我們使用 IDBIndex.openCursor 在該索引上打開了一個基本遊標——這與直接在 ObjectStore 上使用 IDBObjectStore.openCursor 開啟遊標的工作方式相同,但返回的記錄是根據索引排序的,而不是主鍵。

最後,我們遍歷每條記錄,並將資料插入 HTML 表格。有關完整的可執行示例,請參閱我們的 IndexedDB-examples demo 倉庫線上檢視示例)。

js
function displayDataByIndex() {
  tableEntry.textContent = "";
  const transaction = db.transaction(["contactsList"], "readonly");
  const objectStore = transaction.objectStore("contactsList");

  const myIndex = objectStore.index("lName");
  myIndex.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const tableRow = document.createElement("tr");
      for (const cell of [
        cursor.value.id,
        cursor.value.lName,
        cursor.value.fName,
        cursor.value.jTitle,
        cursor.value.company,
        cursor.value.eMail,
        cursor.value.phone,
        cursor.value.age,
      ]) {
        const tableCell = document.createElement("td");
        tableCell.textContent = cell;
        tableRow.appendChild(tableCell);
      }
      tableEntry.appendChild(tableRow);

      cursor.continue();
    } else {
      console.log("Entries all displayed.");
    }
  };
}

規範

規範
Indexed Database API 3.0
# index-interface

瀏覽器相容性

另見