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

 

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

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

创建索引

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

  • 索引名称
  • 索引属性字段名
  • 索引属性值是否唯一
  1. function openDB (name,version) {
  2. var version=version || 1;
  3. var request=window.indexedDB.open(name,version);
  4. request.onerror=function(e){
  5. console.log(e.currentTarget.error.message);
  6. };
  7. request.onsuccess=function(e){
  8. myDB.db=e.target.result;
  9. };
  10. request.onupgradeneeded=function(e){
  11. var db=e.target.result;
  12. if(!db.objectStoreNames.contains('students')){
  13. var store=db.createObjectStore('students',{keyPath: 'id'});
  14. store.createIndex('nameIndex','name',{unique:true});
  15. store.createIndex('ageIndex','age',{unique:false});
  16. }
  17. console.log('DB version changed to '+version);
  18. };
  19. }

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

利用索引获取数据

  1. function getDataByIndex(db,storeName){
  2. var transaction=db.transaction(storeName);
  3. var store=transaction.objectStore(storeName);
  4. var index = store.index("nameIndex");
  5. index.get('Byron').onsuccess=function(e){
  6. var student=e.target.result;
  7. console.log(student.id);
  8. }
  9. }

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

游标

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

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

  1. function fetchStoreByCursor(db,storeName){
  2. var transaction=db.transaction(storeName);
  3. var store=transaction.objectStore(storeName);
  4. var request=store.openCursor();
  5. request.onsuccess=function(e){
  6. var cursor=e.target.result;
  7. if(cursor){
  8. console.log(cursor.key);
  9. var currentStudent=cursor.value;
  10. console.log(currentStudent.name);
  11. cursor.continue();
  12. }
  13. };
  14. }

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

index与游标结合

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

  1. function getMultipleData(db,storeName){
  2. var transaction=db.transaction(storeName);
  3. var store=transaction.objectStore(storeName);
  4. var index = store.index("ageIndex");
  5. var request=index.openCursor(IDBKeyRange.only(26))
  6. request.onsuccess=function(e){
  7. var cursor=e.target.result;
  8. if(cursor){
  9. var student=cursor.value;
  10. console.log(student.id);
  11. cursor.continue();
  12. }
  13. }
  14. }

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

指定游标范围

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

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

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

true

  1. ));
  2. request.onsuccess=function(e){
  3. var cursor=e.target.result;
  4. if(cursor){
  5. var student=cursor.value;
  6. console.log(student.name);
  7. cursor.continue();
  8. }
  9. }
  10. }

完整示例

  1. 1 <!DOCTYPE HTML>
  2. 2 <html>
  3. 3 <head>
  4. 4 <title>IndexedDB</title>
  5. 5 </head>
  6. 6 <body>
  7. 7 <script type="text/javascript">
  8. 8 function openDB (name,version) {
  9. 9 var version=version || 1;
  10. 10 var request=window.indexedDB.open(name,version);
  11. 11 request.onerror=function(e){
  12. 12 console.log(e.currentTarget.error.message);
  13. 13 };
  14. 14 request.onsuccess=function(e){
  15. 15 myDB.db=e.target.result;
  16. 16 };
  17. 17 request.onupgradeneeded=function(e){
  18. 18 var db=e.target.result;
  19. 19 if(!db.objectStoreNames.contains('students')){
  20. 20 var store=db.createObjectStore('students',{keyPath: 'id'});
  21. 21 store.createIndex('nameIndex','name',{unique:true});
  22. 22 store.createIndex('ageIndex','age',{unique:false});
  23. 23 }
  24. 24 console.log('DB version changed to '+version);
  25. 25 };
  26. 26 }
  27. 27
  28. 28 function closeDB(db){
  29. 29 db.close();
  30. 30 }
  31. 31
  32. 32 function deleteDB(name){
  33. 33 indexedDB.deleteDatabase(name);
  34. 34 }
  35. 35
  36. 36 function addData(db,storeName){
  37. 37 var transaction=db.transaction(storeName,'readwrite');
  38. 38 var store=transaction.objectStore(storeName);
  39. 39
  40. 40 for(var i=0;i<students.length;i++){
  41. 41 store.add(students[i]);
  42. 42 }
  43. 43 }
  44. 44
  45. 45 function getDataByKey(db,storeName,value){
  46. 46 var transaction=db.transaction(storeName,'readwrite');
  47. 47 var store=transaction.objectStore(storeName);
  48. 48 var request=store.get(value);
  49. 49 request.onsuccess=function(e){
  50. 50 var student=e.target.result;
  51. 51 console.log(student.name);
  52. 52 };
  53. 53 }
  54. 54
  55. 55 function updateDataByKey(db,storeName,value){
  56. 56 var transaction=db.transaction(storeName,'readwrite');
  57. 57 var store=transaction.objectStore(storeName);
  58. 58 var request=store.get(value);
  59. 59 request.onsuccess=function(e){
  60. 60 var student=e.target.result;
  61. 61 student.age=35;
  62. 62 store.put(student);
  63. 63 };
  64. 64 }
  65. 65
  66. 66 function deleteDataByKey(db,storeName,value){
  67. 67 var transaction=db.transaction(storeName,'readwrite');
  68. 68 var store=transaction.objectStore(storeName);
  69. 69 store.delete(value);
  70. 70 }
  71. 71
  72. 72 function clearObjectStore(db,storeName){
  73. 73 var transaction=db.transaction(storeName,'readwrite');
  74. 74 var store=transaction.objectStore(storeName);
  75. 75 store.clear();
  76. 76 }
  77. 77
  78. 78 function deleteObjectStore(db,storeName){
  79. 79 var transaction=db.transaction(storeName,'versionchange');
  80. 80 db.deleteObjectStore(storeName);
  81. 81 }
  82. 82
  83. 83 function fetchStoreByCursor(db,storeName){
  84. 84 var transaction=db.transaction(storeName);
  85. 85 var store=transaction.objectStore(storeName);
  86. 86 var request=store.openCursor();
  87. 87 request.onsuccess=function(e){
  88. 88 var cursor=e.target.result;
  89. 89 if(cursor){
  90. 90 console.log(cursor.key);
  91. 91 var currentStudent=cursor.value;
  92. 92 console.log(currentStudent.name);
  93. 93 cursor.continue();
  94. 94 }
  95. 95 };
  96. 96 }
  97. 97
  98. 98 function getDataByIndex(db,storeName){
  99. 99 var transaction=db.transaction(storeName);
  100. 100 var store=transaction.objectStore(storeName);
  101. 101 var index = store.index("ageIndex");
  102. 102 index.get(26).onsuccess=function(e){
  103. 103 var student=e.target.result;
  104. 104 console.log(student.id);
  105. 105 }
  106. 106 }
  107. 107
  108. 108 function getMultipleData(db,storeName){
  109. 109 var transaction=db.transaction(storeName);
  110. 110 var store=transaction.objectStore(storeName);
  111. 111 var index = store.index("nameIndex");
  112. 112 var request=index.openCursor(null,IDBCursor.prev);
  113. 113 request.onsuccess=function(e){
  114. 114 var cursor=e.target.result;
  115. 115 if(cursor){
  116. 116 var student=cursor.value;
  117. 117 console.log(student.name);
  118. 118 cursor.continue();
  119. 119 }
  120. 120 }
  121. 121 }
  122. 122
  123. 123 var myDB={
  124. 124 name:'test',
  125. 125 version:1,
  126. 126 db:null
  127. 127 };
  128. 128
  129. 129 var students=[{
  130. 130 id:,
  131. 131 name:"Byron",
  132. 132 age:24
  133. 133 },{
  134. 134 id:,
  135. 135 name:"Frank",
  136. 136 age:30
  137. 137 },{
  138. 138 id:,
  139. 139 name:"Aaron",
  140. 140 age:26
  141. 141 },{
  142. 142 id:,
  143. 143 name:"Casper",
  144. 144 age:26
  145. 145 }];
  146. 146 </script>
  147. 147 </body>
  148. 148 </html>

最后

有了游标和索引才能真正发挥indexedDB为例,是不是感觉比自定义对象强大方便了很多呢。

来源于:http://www.cnblogs.com/dolphinX/p/3416889.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(一:基本使用)

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

  4. html5本地存储(二)--- SQLList

    html5内置了2种本地数据库,一是被称为“SQLLite”,可以通过SQL语言来访问文件型SQL数据库.二是被称为“indexedDB” 的NoSQL类型的数据库 这篇主要讲SQLLite 在js中 ...

  5. HTML5本地存储——Web SQL Database与indexedDB

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

  6. HTML5 ——本地存储

    目录 一.HTML4客户端存储 1.1.提交表单发送到服务器的信息 1.2.客户端本地存储概要 二.localStorage 2.1.添加 2.2.取值 2.3.修改 2.4.删除 2.5.跨页面与跨 ...

  7. HTML5本地存储localStorage与sessionStorage

    在最近的项目中用到了html5的本地存储,下面总结一下. 1.html5几种存储形式 本地存储(localStorage && sessionStorage) 离线缓存(applica ...

  8. HTML5本地存储localStorage与sessionStorage详解

    前言 在最近的项目中用到了html5的本地存储,下面总结一下. 1.html5几种存储形式 本地存储(localStorage && sessionStorage) 离线缓存(appl ...

  9. HTML5本地存储(Local Storage) 的前世今生

    长久以来本地存储能力一直是桌面应用区别于Web应用的一个主要优势.对于桌面应用(或者原生应用),操作系统一般都提供了一个抽象层用来帮助应用程序保存其本地数据 例如(用户配置信息或者运行时状态等). 常 ...

随机推荐

  1. CentOS 6.4一键自动化安装ISO镜像光盘

    下载CentOS-6.4-x86_64-minimal.iso 1 http://mirrors.163.com/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-mi ...

  2. cs4.1 编译与安装

    cs4.1编译报 https://issues.apache.org/jira/browse/CLOUDSTACK-2913 cs4.1安装报

  3. Docker学习记录常用命令

    1. docker ps  -a 查看运行中的容器 2. docker images 查看docker镜像 3. docker rm id(容器id)  删除容器(容器id可以通过docker ps查 ...

  4. C++ std::vector<bool>

    std::vector template < class T, class Alloc = allocator<T> > class vector; // generic te ...

  5. DOM0级与DOM2级

    定义: 0级DOM 分为2个:一是在标签内写onclick事件  二是在JS写onlicke=function(){}函数 1) <input id="myButton" t ...

  6. 打开程序出现.Net Framework Initialization Error – Unable to find a version of the runtime to run this applicatio的解决办法

    部署一个VS2010开发的程序时遇到 了一个非常奇怪的问题,客户端上已经安装了.net framework 4.0,但运行时还是会弹出错误: .Net Framework Initialization ...

  7. 从零开始学习前端JAVASCRIPT — 9、JavaScript基础RegExp(正则表达式)

    1:正则的概念 正则表达式(regular expression)是一个描述字符规则的对象.可以用来检查一个字符串是否含有某个子字符串,将匹配的子字符串做替换或者从某个字符串中取出符合某个条件的子串等 ...

  8. JavaScript语言精粹 笔记02 函数

    函数函数对象函数字面量调用参数返回异常给类型增加方法递归作用域闭包回调模块级联套用记忆   函数 1 函数对象 在JS中函数就是对象.对象是“名/值”对的集合并拥有一个连接到原型对象的隐藏连接.对象字 ...

  9. 【微服务架构】SpringCloud之Eureka(注册中心集群篇)(三)

    上一篇讲解了spring注册中心(eureka),但是存在一个单点故障的问题,一个注册中心远远无法满足实际的生产环境,那么我们需要多个注册中心进行集群,达到真正的高可用.今天我们实战来搭建一个Eure ...

  10. airpods2代连接macbook失败

    更新至最新系统(10.14.4),更新完毕,重启电脑再次连接即可. 参考连接: http://dq.tieba.com/p/6082366443