You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IndexedDB使用IDBKeyRange对cursor设置过滤条件后无返回结果问题

问题原因
  • 过滤对象错误:你创建的name索引独立于对象存储主键,直接在user对象存储上调用openCursor时,范围匹配的是对象存储的主键(即id字段),你传入的name相关范围和id完全不匹配,自然返回空结果。需要先拿到name索引实例,再在索引上调用openCursor。
  • 范围参数类型错误:name字段是字符串类型,你在bound方法中传入了数组['aaa']、['ccc'],类型不匹配也会导致匹配失败;另外你设置了两端都是开区间(后两个参数为true),如果需要包含aaa和ccc两个端点,需要把这两个参数改为false。

注意:如果之前已经在本地创建过test1库且版本号为1,onupgradeneeded事件不会重新触发,可能导致索引未创建。测试前可以先在浏览器开发者工具的应用-存储-IndexedDB里删除旧的test1库,或者把indexedDB.open的版本号改成2触发升级逻辑。

修正后的核心代码
function readAll() {
  let objectStore = db.transaction(['user']).objectStore('user');
  // 先获取name索引实例
  let nameIndex = objectStore.index('name');

  let range = null;
  // 示例1:查询大于等于aaa的所有记录
  // range = IDBKeyRange.lowerBound('aaa');
  // 示例2:查询aaa到ccc之间(包含两端)的记录
  range = IDBKeyRange.bound('aaa', 'ccc', false, false);
  // 示例3:查询aaa到ccc之间(不含两端)的记录,仅返回bbb
  // range = IDBKeyRange.bound('aaa', 'ccc', true, true);

  // 在索引上打开游标
  nameIndex.openCursor(range).onsuccess = function(e) {
    let cursor = e.target.result;               
    if (cursor) {
      // cursor.key是索引值也就是name,cursor.value是完整用户对象
      console.log(cursor.key, cursor.value);
      cursor.continue();
    } 
    else {
      console.log('---------------------------------');
    }
  };
}

内容的提问来源于stack exchange,提问作者Dalibor

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:36:03