HTML5本地存储——IndexedDB(二:索引)

在HTML5本地存储——IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器——索引。

熟悉数据库的同学都知道索引的一个好处就是可以迅速定位数据,提高搜索速度,在indexedDB中有两种索引,一种是自增长的int值,一种是keyPath:自己指定索引列,我们重点来看看keyPath方式的索引使用.

创建索引

我们可以在创建object store的时候指明索引,使用object store的createIndex创建索引,方法有三个参数

  • 索引名称
  • 索引属性字段名
  • 索引属性值是否唯一
function openDB (name,version) {var version=version || 1;var request=window.indexedDB.open(name,version); request.οnerrοr=function(e){ console.log(e.currentTarget.error.message); }; request.onsuccess=function(e){ myDB.db=e.target.result; }; request.onupgradeneeded=function(e){ var db=e.target.result; if(!db.objectStoreNames.contains('students')){ var store=db.createObjectStore('students',{keyPath: 'id'}); store.createIndex('nameIndex','name',{unique:true}); store.createIndex('ageIndex','age',{unique:false}); } console.log('DB version changed to '+version); }; }

这样我们在students 上创建了两个索引

利用索引获取数据

function getDataByIndex(db,storeName){var transaction=db.transaction(storeName);var store=transaction.objectStore(storeName); var index = store.index("nameIndex"); index.get('Byron').onsuccess=function(e){ var student=e.target.result; console.log(student.id); } }

这样我们可以利用索引快速获取数据,name的索引是唯一的没问题,但是对于age索引只会取到第一个匹配值,要想得到所有age符合条件的值就需要使用游标了

游标

在indexedDB中使用索引和游标是分不开的,对数据库熟悉的同学很好理解游标是什么东东,有了数据库object store的游标,我们就可以利用游标遍历object store了。

使用object store的openCursor()方法打开游标

function fetchStoreByCursor(db,storeName){var transaction=db.transaction(storeName);var store=transaction.objectStore(storeName); var request=store.openCursor(); request.onsuccess=function(e){ var cursor=e.target.result; if(cursor){ console.log(cursor.key); var currentStudent=cursor.value; console.log(currentStudent.name); cursor.continue(); } }; }

curson.contine()会使游标下移,知道没有数据返回undefined

index与游标结合

要想获取age为26的student,可以结合游标使用索引

function getMultipleData(db,storeName){var transaction=db.transaction(storeName);var store=transaction.objectStore(storeName); var index = store.index("ageIndex"); var request=index.openCursor(IDBKeyRange.only(26)) request.onsuccess=function(e){ var cursor=e.target.result; if(cursor){ var student=cursor.value; console.log(student.id); cursor.continue(); } } }

这样我们可是使用索引打开一个游标,参数下面会讲到,在成功的句柄内获得游标便利age为26的student,也可以通过index.openKeyCursor()方法只获取每个对象的key值。

指定游标范围

index.openCursor()/index.openKeyCursor()方法在不传递参数的时候会获取object store所有记录,像上面例子一样我们可以对搜索进行筛选
可以使用key range 限制游标中值的范围,把它作为第一个参数传给 openCursor() 或是 openKeyCursor()
IDBKeyRange.only(value):只获取指定数据
IDBKeyRange.lowerBound(value,isOpen):获取最小是value的数据,第二个参数用来指示是否排除value值本身,也就是数学中的是否是开区间
IDBKeyRange.upperBound(value,isOpen):和上面类似,用于获取最大值是value的数据
IDBKeyRange.bound(value1,value2,isOpen1,isOpen2):不用解释了吧

获取名字首字母在B-E的student

function getMultipleData(db,storeName){var transaction=db.transaction(storeName);var store=transaction.objectStore(storeName); var index = store.index("nameIndex"); var request=index.openCursor(IDBKeyRange.bound('B','F',false,

true

));request.onsuccess=function(e){var cursor=e.target.result;if(cursor){ var student=cursor.value; console.log(student.name); cursor.continue(); } } }

完整示例

  1 <!DOCTYPE HTML>
  2 <html>  3 <head>  4 <title>IndexedDB</title>  5 </head>  6 <body>  7 <script type="text/javascript">  8 function openDB (name,version) {  9 var version=version || 1;  10 var request=window.indexedDB.open(name,version);  11  request.onerror=function(e){  12  console.log(e.currentTarget.error.message);  13  };  14  request.onsuccess=function(e){  15  myDB.db=e.target.result;  16  };  17  request.onupgradeneeded=function(e){  18 var db=e.target.result;  19 if(!db.objectStoreNames.contains('students')){  20 var store=db.createObjectStore('students',{keyPath: 'id'});  21  store.createIndex('nameIndex','name',{unique:true});  22  store.createIndex('ageIndex','age',{unique:false});  23  }  24  console.log('DB version changed to '+version);  25  };  26  }  27  28 function closeDB(db){  29  db.close();  30  }  31  32 function deleteDB(name){  33  indexedDB.deleteDatabase(name);  34  }  35  36 function addData(db,storeName){  37 var transaction=db.transaction(storeName,'readwrite');  38 var store=transaction.objectStore(storeName);  39  40 for(var i=0;i<students.length;i++){  41  store.add(students[i]);  42  }  43  }  44  45 function getDataByKey(db,storeName,value){  46 var transaction=db.transaction(storeName,'readwrite');  47 var store=transaction.objectStore(storeName);  48 var request=store.get(value);  49  request.onsuccess=function(e){  50 var student=e.target.result;  51  console.log(student.name);  52  };  53  }  54  55 function updateDataByKey(db,storeName,value){  56 var transaction=db.transaction(storeName,'readwrite

转载于:https://www.cnblogs.com/benbentu/p/4930106.html

HTML5本地存储——IndexedDB二:索引相关推荐

  1. HTML5本地存储——IndexedDB(二:索引)

    在HTML5本地存储--IndexedDB(一:基本使用)中介绍了关于IndexedDB的基本使用方法,很不过瘾,这篇我们来看看indexedDB的杀器--索引. 熟悉数据库的同学都知道索引的一个好处 ...

  2. HTML5本地存储——IndexedDB

    在HTML5本地存储--Web SQL Database提到过Web SQL Database实际上已经被废弃,而HTML5的支持的本地存储实际上变成了 Web Storage(Local Stora ...

  3. HTML5本地存储IndexedDB基础使用

    做项目时需要用H5本地存储,感觉还不错 下面是一些基础知识和一个完整的实例 HTML5 的一个重要特性是本地数据持久性,它使用户能够在线和离线访问 Web 应用程序.此外,本地数据持久性使移动应用程序 ...

  4. HTML5本地存储——Web SQL Database

    在HTML5 WebStorage介绍了html5本地存储的Local Storage和Session Storage,这两个是以键值对存储的解决方案,存储少量数据结构很有用,但是对于大量结构化数据就 ...

  5. HTML5本地存储之Web Storage篇

    2019独角兽企业重金招聘Python工程师标准>>> Web Storage是HTML5引入的一个非常重要的功能,在前端开发中经常用到,可以在客户端本地存储数据,类似HTML4的c ...

  6. HTML5本地存储不完全指南

    历史 在HTML5本地存储之前,如果我们想在客户端保存持久化数据,有这么几个选择: HTTP cookie.HTTP cookie的缺点很明显,最多只能存储4KB的数据,每个HTTP请求都会被传送回服 ...

  7. HTML5 —— 本地存储

    随着互连网的快速发展,基于网页的应用越来越普遍,同时也变得越来越复杂,为了满足各种各样的需求,会经常性在本地存储大量的数据.对此,HTML 规范提出了相关解决方案.   本文为博主学习时所记笔记,参考 ...

  8. HTML5 本地存储和内容按需加载的思路和方法

    HTML5 本地存储和内容按需加载的思路和方法 作者:佚名 字体:[增加 减小] 来源:互联网 时间:04-07 16:05:09 我要评论 本文将着重介绍HTML5本地存储和内容按需加载的思路和方法 ...

  9. HTML5 本地存储

    HTML5 本地存储 1.sessionStorage 2.localStorage 3.Database Storage 4.globalStorage 5.兼容性 参考文献 本地持久化存储一直是本 ...

  10. html5储存类型,html5本地存储-留言板

    HTML5每日一练之JS API-本地存储LocalStorage 留言板 | 前端开发网(W3Cfuns.com)! var Storage = { saveData:function()//保存数 ...

最新文章

  1. Openshift API部分源码学习笔记(一)
  2. CMDB 设计(二)实现host、ip存储
  3. 视图中的难点:主键表 About Key-Preserved Tables
  4. Spring Boot定时任务-Quartz基本使用
  5. 剑指Offer-数组中重复的数字
  6. IIS6注册.net4.0
  7. java ssm框架 mapper文件里的#符号和$符号的区别
  8. poj1990两个树状数组
  9. 光猫上网问题 看我如何解决
  10. win7 简体中文旗舰版 MSDN官方原版
  11. BP算法详细推导及分析
  12. 企业股权价值评估:市场法及收益法的评估思路
  13. 一览数据异步加载的解决方案
  14. mysql assoc什么意思_mysql_assoc
  15. 读jQuery之十七(attribute/property/class)
  16. Linux的LVM磁盘卷轴深度学习
  17. 互联网日报 | 2月28日 星期日 | 百世快递回应部分网点倒闭;上汽奥迪明年一季度开始销售;魅族18系列取消附送充电器...
  18. 设计模式(二)抽象工厂模式
  19. 卓越员工对“怠惰”说不
  20. MongoDB 中文的全文索引

热门文章

  1. 如何使用 Keynote 设计有质感的 PPT 封面?
  2. mac如何删除用户或者群组
  3. VMware mac虚拟机如何安装Windows系统
  4. CVE-2018-15982 flash 0day漏洞分析报告
  5. 微信实现双向跨境支付,将向香港用户开放内地支付服务
  6. 深入理解JUnit 5的扩展模型
  7. Oracle 11gR2 RAC 常用维护操作 说明
  8. 【POJ3045】Cow Acrobats(贪心)
  9. html5学习笔记(7)
  10. xcode免证书真机调试iphone(ipad)程序的具体方法(总结贴)转贴)