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

浏览器兼容性

另见