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
相关产品推荐
相关产品推荐

