使用事务可以通过一个已知键取得一条记录。如果想取得多条数据,则需要在事务中创建一个游标。
游标是一个指向结果集的指针。与传统数据库查询不同,游标不会事先收集所有结果。相反,游标指向
第一个结果,并在接到指令前不会主动查找下一条数据。
需要在对象存储上调用openCursor()方法创建游标。与其他IndexedDB操作一样,openCursor()
方法也返回一个请求,因此必须为它添加onsuccess 和onerror 事件处理程序。例如:
const transaction = db.transaction(“users”),
store = transaction.objectStore(“users”),
request = store.openCursor();
request.onsuccess = (event) => {
// 处理成功
};
request.onerror = (event) => {
// 处理错误
};
在调用onsuccess 事件处理程序时,可以通过event.target.result 访问对象存储中的下一条
记录,这个属性中保存着IDBCursor 的实例(有下一条记录时)或null(没有记录时)。这个IDBCursor
实例有几个属性。
direction:字符串常量,表示游标的前进方向以及是否应该遍历所有重复的值。可能的值包括:
NEXT(“next”)、NEXTUNIQUE(“nextunique”)、PREV(“prev”)、PREVUNIQUE(“prevunique”)。
key:对象的键。
value:实际的对象。
primaryKey:游标使用的键。可能是对象键或索引键(稍后讨论)。
可以像下面这样取得一个结果:
request.onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) { // 永远要检查
console.log(Key: ${cursor.key}, Value: ${JSON.stringify(cursor.value)}
);
}
};
注意,这个例子中的cursor.value 保存着实际的对象。正因为如此,在显示它之前才需要使用
JSON 来编码。
游标可用于更新个别记录。update()方法使用指定的对象更新当前游标对应的值。与其他类似操作
一样,调用update()会创建一个新请求,因此如果想知道结果,需要为onsuccess 和onerror 赋值:
request.onsuccess = (event) => {
const cursor = event.target.result;
let value,
updateRequest;
if (cursor) { // 永远要检查
if (cursor.key == “foo”) {
value = cursor.value; // 取得当前对象
value.password = “magic!”; // 更新密码
updateRequest = cursor.update(value); // 请求保存更新后的对象
updateRequest.onsuccess = () => {
// 处理成功
};
updateRequest.onerror = () => {
// 处理错误
};
}
}
};
也可以调用delelte()来删除游标位置的记录,与update()一样,这也会创建一个请求:
request.onsuccess = (event) => {
const cursor = event.target.result;
let value,
deleteRequest;
if (cursor) { // 永远要检查
if (cursor.key == “foo”) {
deleteRequest = cursor.delete(); // 请求删除对象
deleteRequest.onsuccess = () => {
// 处理成功
};
deleteRequest.onerror = () => {
// 处理错误
};
}
}
};
如果事务没有修改对象存储的权限,update()和delete()都会抛出错误。
默认情况下,每个游标只会创建一个请求。要创建另一个请求,必须调用下列中的一个方法。
continue(key):移动到结果集中的下一条记录。参数key 是可选的。如果没有指定key,游
标就移动到下一条记录;如果指定了,则游标移动到指定的键。
advance(count):游标向前移动指定的count 条记录。
这两个方法都会让游标重用相同的请求,因此也会重用onsuccess 和onerror 处理程序,直至不
再需要。例如,下面的代码迭代了一个对象存储中的所有记录:
request.onsuccess = (event) => {
const cursor = event.target.result;
if (cursor) { // 永远要检查
console.log(Key: ${cursor.key}, Value: ${JSON.stringify(cursor.value)}
);
cursor.continue(); // 移动到下一条记录
} else {
console.log(“Done!”);
}
};
调用cursor.continue()会触发另一个请求并再次调用onsuccess 事件处理程序。在没有更多
记录时,onsuccess 事件处理程序最后一次被调用,此时event.target.result 等于null。
08-15
358
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
05-14
350
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-14
378
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
07-03
243
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-16
335
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
06-02
323
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
02-17
923
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
01-05
1258
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)
08-27
1371
![](https://csdnimg.cn/release/blogv2/dist/pc/img/readCountWhite.png)