HTML5技术

Web数据持久化存储IndexedDB(不常用) - 海角在眼前(2)

字号+ 作者:H5之家 来源:博客园 2015-12-18 08:19 我要评论( )

function openCursor(){ var tx = db.transaction("users" , READ_WRITE); var store = tx.objectStore("users" ); var req = store.openCursor();req.onsuccess = function (evt) { var cursor = evt.target.resul

function openCursor(){ var tx = db.transaction("users", READ_WRITE); var store = tx.objectStore("users"); var req = store.openCursor(); req.onsuccess = function (evt) { var cursor = evt.target.result; value = cursor.value; console.log(value); if(value.name == '杨幂'){ value.age = 16; cursor.update(value); //修改数据(必须是读写模式) } if(value.name == '柳岩'){ cursor.delete(); //删除当前项 } cursor.continue(); //移动到下一项 } }; req.onerror = function (evt) { console.error("openCursor error:", evt.target.errorCode || evt.target.error); }; }

这里有几点要注意:

1. 如果需要修改或删除数据,就需要打开成读写模式。

2. cursor的非空校验是必要的。

3. 修改或删除的操作也是有onsuccess和onerror的,只是在示例中没有写出来。

4. 调用continue才会移动到下一项

另外可以设置游标的键范围和游标的方向,即打开openCursor方法时可以传这两个参数(openCursor(键范围,方向)),第一个参数是object类型,第二个参数是字符串类型。

游标键范围

键范围由IDBKeyRange的实例表示。

IDBKeyRange.only('001'); //只想要键为001的结果 IDBKeyRange.lowerBound('002'); //从键为002开始,到最后 IDBKeyRange.lowerBound('002', true); //从键为002开始,但忽略002,到最后 IDBKeyRange.upperBound('002'); //从头开始,到键为002为止 IDBKeyRange.upperBound('002', true); //从头开始,到键为002为止,但忽略002 IDBKeyRange.bound('001', '005'); //从001开始,到为005为止 IDBKeyRange.bound('001', '005', true, true); //从001开始,到为005为止,但忽略001、005

游标方向

next : 从第一项到最后一项(默认)

prev : 从最后一项到第一项

索引

当需要使用其他属性(非主键)获取数据时,就要预先创建索引,然后使用索引获取数据。

创建索引(在数据库初始化onupgradeneeded事件时)

第一个参数是索引名字,第二个参数是索引的属性的名字,第三个是一个options对象。一般是指定unique,设置索引是否唯一。

usersStore.createIndex("name", "name", { unique : false });

索引获取数据

function indexGetData(){ var tx = db.transaction("users", READ_WRITE); var store = tx.objectStore("users"); var index = store.index("name"); var req = index.get("杨幂") req.onsuccess = function (evt) { console.debug("indexGet success" , evt.target.result); }; req.onerror = function (evt) { console.error("indexGet error:", evt.target.errorCode || evt.target.error); }; } function indexOpenCursor(){ var tx = db.transaction("users", READ_WRITE); var store = tx.objectStore("users"); var index = store.index("name"); var req = index.openCursor(); req.onsuccess = function (evt) { var cursor = evt.target.result; value = cursor.value; console.log(value); cursor.continue(); //移动到下一项 } }; req.onerror = function (evt) { console.error("openCursor error:", evt.target.errorCode || evt.target.error); }; }

PS:索引用法跟普通取值和游标取值一样

对象存储所有索引

function indexNames(){ var tx = db.transaction("users", READ_WRITE); var store = tx.objectStore("users"); var indexNames = store.indexNames; var index, i = 0, len = indexNames.length; while(i < len){ index = store.index(indexNames[i++]); console.log(index); } }

浏览器支持情况

PS:图表来源->

总结

在使用IndexedDB时候,有人可能会拿WebSQL来比较,然后发现IndexedDB不能做表连接(因为根本没有这东西),也就是要查出一个数据,可能得分几次进行。

例如学生、课程、分数三个表数据,想查出某个学生的课程成绩,就得三个表连接,WebSQL分分钟信手拈来。但是如果你用IndexedDB,就得分三次查找,先拿出那个学生,再拿出课程,然后再拿成绩。

这样看起来IndexedDB很蠢,这样就进入误区了,你为什么要这么去存你要展示的数据,NoSql就用NoSql东西,就直接以一个对象存学生成绩,一次查找就行了。

示例下载:

 

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • HTML5 进阶系列:indexedDB 数据库 - _林鑫

    HTML5 进阶系列:indexedDB 数据库 - _林鑫

    2017-04-27 14:02

  • 前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代码你撸了嘛

    前端实现搜索记录功能也就是天猫app历史记录存储方便浏览 - 今天的代

    2017-04-12 14:00

  • 云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.NET Core - 博客园团队

    云计算之路-阿里云上:数据库连接数过万的真相,从阿里云RDS到微软.N

    2017-04-08 15:00

  • 云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢复正常 - 博客园团队

    云计算之路-阿里云上:RDS数据库连接数过万引发故障,主备库切换后恢

    2017-04-07 16:00

网友点评