javascript七基础学习系列一千五百一十:通过游标查询

使用事务可以通过一个已知键取得一条记录。如果想取得多条数据,则需要在事务中创建一个游标。
游标是一个指向结果集的指针。与传统数据库查询不同,游标不会事先收集所有结果。相反,游标指向
第一个结果,并在接到指令前不会主动查找下一条数据。
需要在对象存储上调用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。

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值