使用游标会给人一种不太理想的感觉,因为获取数据的方式受到了限制。使用键范围(key range)
可以让游标更容易管理。键范围对应IDBKeyRange 的实例。有四种方式指定键范围,第一种是使用
only()方法并传入想要获取的键:
const onlyRange = IDBKeyRange.only(“007”);
这个范围保证只获取键为"007"的值。使用这个范围创建的游标类似于直接访问对象存储并调用
get(“007”)。
第二种键范围可以定义结果集的下限。下限表示游标开始的位置。例如,下面的键范围保证游标从
"007"这个键开始,直到最后:
// 从"007"记录开始,直到最后
const lowerRange = IDBKeyRange.lowerBound(“007”);
如果想从"007"后面的记录开始,可以再传入第二个参数true:
// 从"007"的下一条记录开始,直到最后
const lowerRange = IDBKeyRange.lowerBound(“007”, true);
第三种键范围可以定义结果集的上限,通过调用upperBound()方法可以指定游标不会越过的记
录。下面的键范围保证游标从头开始并在到达键为"ace"的记录停止:
// 从头开始,到"ace"记录为止
const upperRange = IDBKeyRange.upperBound(“ace”);
如果不想包含指定的键,可以在第二个参数传入true:
// 从头开始,到"ace"的前一条记录为止
const upperRange = IDBKeyRange.upperBound(“ace”, true);
要同时指定下限和上限,可以使用bound()方法。这个方法接收四个参数:下限的键、上限的键、
可选的布尔值表示是否跳过下限和可选的布尔值表示是否跳过上限。下面是几个例子:
// 从"007"记录开始,到"ace"记录停止
const boundRange = IDBKeyRange.bound(“007”, “ace”);
// 从"007"的下一条记录开始,到"ace"记录停止
const boundRange = IDBKeyRange.bound(“007”, “ace”, true);
// 从"007"的下一条记录开始,到"ace"的前一条记录停止
const boundRange = IDBKeyRange.bound(“007”, “ace”, true, true);
// 从"007"记录开始,到"ace"的前一条记录停止
const boundRange = IDBKeyRange.bound(“007”, “ace”, false, true);
定义了范围之后,把它传给openCursor()方法,就可以得到位于该范围内的游标:
const store = db.transaction(“users”).objectStore(“users”),
range = IDBKeyRange.bound(“007”, “ace”);
request = store.openCursor(range);
request.onsuccess = function(event){
const cursor = event.target.result;
if (cursor) { // 永远要检查
console.log(Key: ${cursor.key}, Value: ${JSON.stringify(cursor.value)}
);
cursor.continue(); // 移动到下一条记录
} else {
console.log(“Done!”);
}
};
这个例子只会输出从键为"007"的记录开始到键为"ace"的记录结束的对象,比上一节的例子要少。
08-14
1465
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-14
3854
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-03
1037
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
03-04
1377
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)