IDBCursor

Baseline 已广泛支持

此特性已相当成熟,可在许多设备和浏览器版本上使用。自 ⁨2015 年 7 月⁩以来,各浏览器均已提供此特性。

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

注意: 不要与 IDBCursorWithValue 混淆,它只是一个带有额外 value 属性的 IDBCursor 接口。

IDBCursor 接口是 IndexedDB API 的一部分,它代表一个用于遍历或迭代数据库中多个记录的 游标

游标有一个源,指示它正在遍历哪个索引或对象存储。它在范围内的位置,并沿键顺序递增或递减的方向移动。游标使应用程序能够异步处理游标范围内的所有记录。

您可以同时拥有无限数量的游标。对于给定的游标,您始终会获得相同的 IDBCursor 对象。操作将在底层索引或对象存储上执行。

实例属性

注意: IDBCursorWithValue 是一个带有额外 value 属性的 IDBCursor 接口。

IDBCursor.source 只读

返回游标正在迭代的 IDBObjectStoreIDBIndex。即使游标当前正在迭代、已迭代到末尾,或者其事务不活跃,此函数也永远不会返回 null 或抛出异常。

IDBCursor.direction 只读

返回游标的遍历方向。

IDBCursor.key 只读

返回游标位置记录的键。如果游标超出了其范围,则此值为 undefined。游标的键可以是任何数据类型。

IDBCursor.primaryKey 只读

返回游标当前有效的首要键。如果游标当前正在迭代或已迭代超出其范围,则此值为 undefined。游标的首要键可以是任何数据类型。

IDBCursor.request 只读

返回用于获取游标的 IDBRequest

实例方法

IDBCursor.advance()

设置游标应向前移动其位置的次数。

IDBCursor.continue()

将游标沿其方向移动到下一个位置,到键与可选的 key 参数匹配的项。

IDBCursor.continuePrimaryKey()

将游标设置为给定的索引键和首要键(作为参数提供)。

IDBCursor.delete()

返回一个 IDBRequest 对象,并在单独的线程中删除游标位置的记录,而不改变游标的位置。这可用于删除特定记录。

IDBCursor.update()

返回一个 IDBRequest 对象,并在单独的线程中更新对象存储中游标当前位置的值。这可用于更新特定记录。

常量

已弃用:此特性不再推荐。虽然某些浏览器可能仍然支持它,但它可能已经从相关的网络标准中删除,可能正在删除过程中,或者可能仅为兼容性目的而保留。请避免使用它,如果可能,请更新现有代码;请参阅本页底部的兼容性表格以指导您的决策。请注意,此特性可能随时停止工作。

警告: 这些常量不再可用 — 它们在 Gecko 25 中已被移除。您应该直接使用字符串常量而不是它们。(Firefox bug 891944

  • NEXT: "next" :游标显示所有记录,包括重复项。它从键范围的下界开始,并向上移动(键顺序单调递增)。
  • NEXTUNIQUE : "nextunique" :游标显示所有记录,但不包括重复项。如果存在具有相同键的多个记录,则只检索迭代到的第一个记录。它从键范围的下界开始,并向上移动。
  • PREV: "prev" :游标显示所有记录,包括重复项。它从键范围的上界开始,并向下移动(键顺序单调递减)。
  • PREVUNIQUE: "prevunique" :游标显示所有记录,但不包括重复项。如果存在具有相同键的多个记录,则只检索迭代到的第一个记录。它从键范围的上界开始,并向下移动。

示例

在这个简单的片段中,我们创建了一个事务,检索了一个对象存储,然后使用游标遍历对象存储中的所有记录。游标不需要我们根据键选择数据;我们可以直接获取所有数据。另外请注意,在循环的每次迭代中,您可以使用 cursor.value.foo 从游标对象下的当前记录中获取数据。有关完整的可运行示例,请参阅我们的 IDBCursor 示例实时查看示例)。

js
function displayData() {
  const transaction = db.transaction(["rushAlbumList"], "readonly");
  const objectStore = transaction.objectStore("rushAlbumList");

  objectStore.openCursor().onsuccess = (event) => {
    const cursor = event.target.result;
    if (cursor) {
      const listItem = document.createElement("li");
      listItem.textContent = `${cursor.value.albumTitle}, ${cursor.value.year}`;
      list.appendChild(listItem);

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

规范

规范
Indexed Database API 3.0
# cursor-interface

浏览器兼容性

另见