IndexedDB 浏览器数据库,是一个非关系型数据库,数据形式使用的是json,IndexedDB适合存储大量数据,它的API是异步调用的,当然他的api 也相对复杂。

当然浏览器数据存储 还有LocalStorage,Cookies,web SQL等 为什么还再来一个indexedDB。

之前我在开发过程中使用的是web sql,可以直接写sql查询数据。

LocalStorage,用key-value键值模式存储数据,而且Localstorage就是专门为小数量数据设计的。

Cookies只能是字符串 而且空间有限。

如果你在实际应用中希望存储大量数据时,IndexedDB会明显的更适合,IndexedDB也能提供你更为复杂的查询数据的方式,还能建立索引,他的索引还是挺666的。

下面是自己看了阮一峰的 文章 http://www.ruanyifeng.com/blog/2018/07/indexeddb.html

简单的学习了下 IndexedDB 对这个浏览器数据库有个大概的了解,下面是个人对IndexedDB 简单的封装。

  1. const dbName = "test";
  2. const dbVersion = 1;
  3.  
  4. export default {
  5. // indexedDB兼容
  6. indexedDB:
  7. window.indexedDB ||
  8. window.webkitindexedDB ||
  9. window.msIndexedDB ||
  10. window.mozIndexedDB,
  11. //name:表名 key:主键 ,cursorIndex 索引
  12. store: {
  13. teacher: {
  14. name: "teacher",
  15. key: "id",
  16. cursorIndex: [{ name: "teachNum", unique: false }]
  17. },
  18. student: {
  19. name: "student",
  20. key: "id",
  21. cursorIndex: [{ name: "stuNum", unique: false }]
  22. }
  23. },
  24. async initDB() {
  25. let that = this;
  26. let request = this.indexedDB.open(dbName, dbVersion);
  27. request.onerror = function() {
  28. console.log("打开数据库失败");
  29. };
  30.  
  31. request.onsuccess = function() {
  32. console.log("打开数据库成功");
  33. };
  34. request.onupgradeneeded = function(event) {
  35. let db = event.target.result;
  36. for (var t in that.store) {
  37. if (!db.objectStoreNames.contains(that.store[t].name)) {
  38. var objectStore = db.createObjectStore(that.store[t].name, {
  39. keyPath: that.store[t].key,
  40. autoIncrement: true
  41. });
  42. for (let i = 0; i < that.store[t].cursorIndex.length; i++) {
  43. const element = that.store[t].cursorIndex[i];
  44. objectStore.createIndex(element.name, element.name, {
  45. unique: element.unique
  46. });
  47. }
  48. }
  49. }
  50. };
  51. },
  52. // 打开数据库
  53. openDB: function() {
  54. return new Promise((resolve, reject) => {
  55. let request = this.indexedDB.open(dbName, dbVersion);
  56.  
  57. request.onerror = function(event) {
  58. reject("IndexedDB数据库打开错误," + event);
  59. };
  60. request.onsuccess = function(event) {
  61. resolve(event.target.result);
  62. };
  63. });
  64. },
  65. // 删除表
  66. deleteDB: function(table) {
  67. let deleteQuest = this.indexedDB.deleteDatabase(table);
  68. deleteQuest.onerror = function() {
  69. return Promise.resolve(false);
  70. };
  71. deleteQuest.onsuccess = function() {
  72. return Promise.resolve(true);
  73. };
  74. },
  75. // 关闭数据库
  76. closeDB: async function(db) {
  77. try {
  78. let d;
  79. if (!db) {
  80. d = await this.openDB();
  81. }
  82. let closeQuest = d.closeDB();
  83. return new Promise(resolve => {
  84. closeQuest.onerror = function() {
  85. resolve(false);
  86. };
  87. closeQuest.onsuccess = function() {
  88. resolve(true);
  89. };
  90. });
  91. } catch (error) {
  92. return Promise.resolve(false);
  93. }
  94. },
  95. // 添加数据,add添加新值
  96. insert: async function(table, data) {
  97. try {
  98. let db = await this.openDB();
  99. let request = db
  100. .transaction(table.name, "readwrite")
  101. .objectStore(table.name)
  102. .add(data);
  103.  
  104. return new Promise((resolve, reject) => {
  105. request.onerror = function() {
  106. reject("添加数据出错");
  107. };
  108. request.onsuccess = function() {
  109. resolve(true);
  110. };
  111. });
  112. } catch (error) {
  113. console.log(error);
  114. return Promise.resolve(false);
  115. }
  116. },
  117. // 更新
  118. update: async function(table, data) {
  119. try {
  120. let db = await this.openDB();
  121. let request = db
  122. .transaction(table.name, "readwrite")
  123. .objectStore(table.name)
  124. .put(data);
  125. return new Promise(resolve => {
  126. request.onerror = function() {
  127. resolve(false);
  128. };
  129. request.onsuccess = function() {
  130. resolve(true);
  131. };
  132. });
  133. } catch (error) {
  134. return Promise.resolve(false);
  135. }
  136. },
  137. // 删除数据
  138. delete: async function(table, keyValue) {
  139. try {
  140. let db = await this.openDB();
  141. let request = db
  142. .transaction(table.name, "readwrite")
  143. .objectStore(table.name)
  144. .delete(keyValue);
  145. return new Promise(resolve => {
  146. request.onerror = function() {
  147. resolve(false);
  148. };
  149. request.onsuccess = function() {
  150. resolve(true);
  151. };
  152. });
  153. } catch (error) {
  154. return Promise.resolve(false);
  155. }
  156. },
  157. // 清空数据
  158. clear: async function(table) {
  159. let db = await this.openDB();
  160. let store = db.transaction(table.name, "readwrite").objectStore(table.name);
  161. store.clear();
  162. },
  163. // 查询数据 表名 索引值 索引 key 没有value key为key 而不是索引
  164. get: async function(table, keyValue, indexCursor) {
  165. try {
  166. let db = await this.openDB();
  167. let store = db
  168. .transaction(table.name, "readonly")
  169. .objectStore(table.name);
  170. let request;
  171. request = !keyValue
  172. ? store.openCursor()
  173. : indexCursor
  174. ? store.index(indexCursor).get(keyValue)
  175. : store.get(keyValue);
  176. let data = [];
  177. return new Promise(resolve => {
  178. request.onerror = function() {
  179. resolve("查询数据失败");
  180. };
  181. request.onsuccess = function(event) {
  182. if (!keyValue && !indexCursor) {
  183. if (event.target.result) {
  184. data.push(event.target.result.value);
  185. event.target.result.continue();
  186. } else {
  187. resolve(data);
  188. }
  189. } else {
  190. resolve([event.target.result]);
  191. }
  192. };
  193. });
  194. } catch (error) {
  195. return Promise.reject(error);
  196. }
  197. },
  198. // 通过游标操作数据, callback中要有游标移动方式
  199. handleDataByCursor: async function(table, keyRange) {
  200. try {
  201. let kRange = keyRange || "";
  202. let db = await this.openDB();
  203. let store = db.transaction(table, "readwrite").objectStore(table),
  204. request;
  205. request = store.openCursor(kRange);
  206. return new Promise(resolve => {
  207. request.onerror = function() {
  208. resolve("通过游标获取数据报错");
  209. };
  210. request.onsuccess = function(event) {
  211. let cursor = event.target.result;
  212. resolve(cursor);
  213. };
  214. });
  215. } catch (error) {
  216. return Promise.reject(error);
  217. }
  218. },
  219. // 通过索引游标操作数据, callback中要有游标移动方式
  220. handleDataByIndex: async function(table, keyRange, sursorIndex) {
  221. try {
  222. let kRange = keyRange || "";
  223. let db = await this.openDB();
  224. let store = db.transaction(table, "readwrite").objectStore(table),
  225. request;
  226. request = store.index(sursorIndex).openCursor(kRange);
  227. return new Promise(resolve => {
  228. request.onerror = function() {
  229. resolve("通过索引游标获取数据报错");
  230. };
  231. request.onsuccess = function(event) {
  232. let cursor = event.target.result;
  233. if (cursor) {
  234. resolve(cursor);
  235. }
  236. };
  237. });
  238. } catch (error) {
  239. return Promise.reject(error);
  240. }
  241. },
  242. // 创建游标索引
  243. createCursorIndex: async function(table, cursorIndex, unique) {
  244. var db = await this.openDB();
  245. let store = db.transaction(table, "readwrite").objectStore(table);
  246. store.createIndex(cursorIndex, cursorIndex, {
  247. unique: unique
  248. });
  249. return Promise.resolve();
  250. }
  251. };

此随笔乃本人学习工作记录,如有疑问欢迎在下面评论,转载请标明出处。

如果对您有帮助请动动鼠标右下方给我来个赞,您的支持是我最大的动力。

IndexedDB 简单封装的更多相关文章

  1. Android AsyncTask 深度理解、简单封装、任务队列分析、自定义线程池

    前言:由于最近在做SDK的功能,需要设计线程池.看了很多资料不知道从何开始着手,突然发现了AsyncTask有对线程池的封装,so,就拿它开刀,本文将从AsyncTask的基本用法,到简单的封装,再到 ...

  2. FMDB简单封装和使用

    工具:火狐浏览器+SQLite Manager插件 ; Xcode; FMDB库; 效果: 项目地址: https://github.com/sven713/PackFMDB 主要参考这两篇博客: 1 ...

  3. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  4. okhttp3 get post 简单封装

    最近打算在新项目中使用 okhttp3, 简单封装了一下异步 get post 因为 CallBack 也是在子线程中执行,所以用到了 Handler public class MyOkHttpCli ...

  5. python网页请求urllib2模块简单封装代码

    这篇文章主要分享一个python网页请求模块urllib2模块的简单封装代码. 原文转自:http://www.jbxue.com/article/16585.html 对python网页请求模块ur ...

  6. 对pymysql的简单封装

    #coding=utf-8 #!/usr/bin/python import pymysql class MYSQL: """ 对pymysql的简单封装 "& ...

  7. iOS开发——UI篇OC篇&UITableView简单封装

    UITableView简单封装 UITableView时iOS开发中使用最多也是最重的一个UI空间,其实在App Store里面的%80以上的应用都用到了这个控件,所以就给大家介绍一下,前面的文章中也 ...

  8. iOS sqlite 增删改查 简单封装(基于 FMDB)

    /** *  对 sqlite 的使用进行简单封装,仅涉及简单的单表 增删改查 * *  基于 FMDB * *  操作基于 model ,数据库表字段与 model 属性一一对应,对 model 整 ...

  9. ADO简单封装(MFC)

    简单封装了一下,不是很严谨. /************************************************************************/ /* INSTRUC ...

随机推荐

  1. STC项目风险分析

    一.引言 由于项目的实现具有不确定性,所以每个项目都是存在风险的. 项目实现过程中的复杂性以及项目内外许多变化的因素,都会造成项目实现过程中的风险. 如果不能对项目的风险进行很好的分析和管理,那么项目 ...

  2. dubbo-2.5.6优雅停机研究

    不优雅的停机: 当进程存在正在运行的线程时,如果直接执行kill -9 pid时,那么这个正在执行的线程被中断,就好像一个机器运行中突然遭遇断电的情况,所导致的结果是造成服务调用的消费端报错,也有可能 ...

  3. 解决win系统无法安装.NET Framework 4.0 4.6 原因是HRESULT0xc8000222

    1.开始----- 运行------- cmd ----- 键入net stop WuAuServ回车(停止windows update服务) 2.开始----- 运行----键入%windir%回车 ...

  4. vs2015 不能启动 iis express

    删除以下目录的文件 <<path_to_solution_folder>>\.vs\config\applicationhost.config具体地址http://stacko ...

  5. HttpHelpers类普通GET和POST方式,带Cookie和带证书验证模式

    HttpHelpers类普通GET和POST方式,带Cookie和带证书验证模式 参考路径:https://www.cnblogs.com/splendidme/archive/2011/09/14/ ...

  6. maven的介绍及如何获取jar包

    本文转载自   https://www.cnblogs.com/whgk/p/7112560.html 该篇文章篇幅较长,大概的思路如下 maven的介绍,初步认识,获取jar包的三个关键属性 --& ...

  7. [少数派]如何学习Git

    用玩游戏的方式学习 Git 目录 为什么要学习 Git 怎么学习 Git Learn Git Branching 其他学习资源 用游戏的方式来学习,是一种有趣而高效的方式. 从刚接触电脑时的打字练习软 ...

  8. 在datasnap 中使用unidac 访问数据(客户端)

    前面我们讲了如何使用unidac 在datasnap 的服务端访问数据库,今天大概讲一下客户端如何访问 前面做的服务器?其实这个客户端适合任何datasnap 服务端. 首先我们建一个应用,并加入一个 ...

  9. 解决redis连接错误:MISCONF Redis is configured to save RDB snapshots, but it is currently not able to...

    今天Redis服务器在连接redis数据库时突然报错:MISCONF Redis is configured to save RDB snapshots, but it is currently no ...

  10. duilib窗口从任务栏恢复问题

    关闭.最大最小化和恢复等消息由WM_SYSCOMMAND和OnSysCommand()进行处理,需要在HandleMessage()中添加处理.