indexeddb - 如何获取所有 IDBIndex 键值(而不是对象存储主键)?
问题描述
我有一个带有主键和附加索引(具有唯一键约束)的 IndexedDB 对象存储。
现在我想检索这个索引的所有键值。
以前,我使用 IDBIndex.getAllKeys(),但显然此方法的行为已更改为返回对象存储主键而不是索引键。(但是,我无法在浏览器发行说明中找到任何文档或参考...)
所以我的问题是:检索所有索引键值的推荐、最高效的方法是什么?
解决方案
IDBIndex.getAll
会起作用,但它会将所有值读入内存,这可能会很慢。
你是正确的,IDBIndex.getAllKeys
只返回主键,而不是索引键。
不幸的是,没有类似的单个函数会返回索引键,但您可以使用IDBIndex.openKeyCursor
并避免将值读入内存:
const result = [];
index.openKeyCursor().onsuccess = (event) => {
var cursor = event.target.result;
if (cursor) {
// cursor.key is the index key, cursor.primaryKey is the primary key,
// and cursor.value is undefined because we're using openKeyCursor
// rather than openCursor.
result.push(cursor.key);
cursor.continue();
} else {
cb(result);
}
};
我没有对此进行基准测试,但理论上它可能接近于getAllKeys
,尽管可能至少有点慢,因为它需要触发和处理 N 个事件而不是一个。
只是不要在 MS Edge 中尝试 :)
以前,我使用 IDBIndex.getAllKeys(),但显然此方法的行为已更改为返回对象存储主键而不是索引键。(但是,我无法在浏览器发行说明中找到任何文档或参考...)
如果您使用的是indexeddb-getall-shim,早期版本确实会错误地返回索引键而不是主键。这从未在规范中,只是垫片中的一个错误。既然我写了垫片……如果这确实是您困惑的根源,我深表歉意!
推荐阅读
- arangodb - Arangodb 游标系统字段
- docker - docker rabbitmq 如何使用 docker 文件公开端口和重用容器
- javascript - 无法在 laravel 应用程序上加载谷歌地图
- html - 防止长单元格内容拉伸单元格
- android - 如何将我从服务器获得的列表视图项的 ID 传递给另一个活动 onclick?
- python - Keras LSTM 网络,形状错误:InvalidArgumentError:不兼容的形状:[6853] 与 [89]
- scala - 如何为 Spark 中的任务分配执行者?
- javascript - 如果 react-router4 中的位置没有改变,如何防止 history.push?
- php - 我正在尝试获取 php 中的根 url
- php - c ++ curl返回413请求实体太大但是帖子大小远小于最大大小