IndexDbFactory.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. window.indexedDB = window.indexedDB ||
  2. window.mozIndexedDB ||
  3. window.webkitIndexedDB ||
  4. window.msIndexedDB;
  5. window.IDBTransaction = window.IDBTransaction ||
  6. window.webkitIDBTransaction ||
  7. window.msIDBTransaction;
  8. window.IDBKeyRange = window.IDBKeyRange ||
  9. window.webkitIDBKeyRange ||
  10. window.msIDBKeyRange;
  11. /**
  12. * 获取数据库操作对象
  13. * @param {*} dbName 数据名称
  14. * @param {*} objectStoreDefines 表定义
  15. * @param {*} version 版本号,整数,举例:1
  16. */
  17. function IndexDbFactory(dbName, objectStoreDefines, version) {
  18. this.dbName = dbName;
  19. this.objectStoreDefines = objectStoreDefines;
  20. this.version = version;
  21. this.db = null;
  22. this.open = function (successCallback, errorCallback) {
  23. let _self = this;
  24. var request = window.indexedDB.open(this.dbName, version);
  25. request.onsuccess = function (e) {
  26. _self.db = request.result;
  27. console.log('数据库 %s 打开成功', _self.dbName);
  28. successCallback();
  29. };
  30. request.onupgradeneeded = function (e) {
  31. _self.db = e.target.result;
  32. var names = _self.db.objectStoreNames;
  33. for (let index = 0; index < _self.objectStoreDefines.length; index++) {
  34. let objectStoreName = _self.objectStoreDefines[index].name;
  35. if (names.contains(objectStoreName)) {
  36. // 如果 ObjectStore 已经存在,那么先删除数据
  37. _self.db.deleteObjectStore(objectStoreName);
  38. }
  39. let objectStoreDefinesOption = _self.objectStoreDefines[index].defineOption;
  40. var objectStore = _self.db.createObjectStore(
  41. objectStoreName,
  42. objectStoreDefinesOption
  43. );
  44. let indexDefines = _self.objectStoreDefines[index].indexDefineList;
  45. if (indexDefines != null) {
  46. for (let index1 = 0; index1 < indexDefines.length; index1++) {
  47. let indexDefine = indexDefines[index1];
  48. objectStore.createIndex(indexDefine.indexName, indexDefine.keyPath, indexDefine.objectParameters);
  49. }
  50. }
  51. }
  52. console.log('数据库 %s 升级成功', _self.dbName);
  53. successCallback();
  54. };
  55. request.onerror = function (e) {
  56. console.error('数据库 %s 打开异常,异常编号 %s,异常信息。', _self.dbName, e.target.code, e);
  57. errorCallback();
  58. };
  59. };
  60. this.close = function () {
  61. this.db.close();
  62. this.db = null;
  63. console.log('数据库 %s 已经关闭', this.dbName);
  64. }
  65. this.getObjectStore = function (mode, objectStoreName) {
  66. let _self = this;
  67. mode = mode || 'readonly';
  68. var txn = _self.db.transaction([_self.objectStoreName], mode);
  69. return store;
  70. };
  71. /**
  72. * 保存/修改数据
  73. * put 方法重复添加数据会覆盖原有数据
  74. * @param {*} objectStoreName 表名
  75. * @param {*} data 待保存的数据
  76. * @param {*} successCallback 操作成功 callback
  77. * @param {*} errorCallback 操作失败 callback
  78. */
  79. this.put = function (objectStoreName, data, successCallback, errorCallback) {
  80. let _self = this;
  81. if (_self.db == null) {
  82. errorCallback('数据库打开失败。');
  83. return;
  84. }
  85. var transaction = _self.db.transaction([objectStoreName], 'readwrite');
  86. var store = transaction.objectStore(objectStoreName);
  87. // 修改数据,可以使用put, 添加数据也可以用put, put方法重复添加数据会覆盖原有数据
  88. var request = store.put(data);
  89. request.onsuccess = successCallback;
  90. request.onerror = errorCallback;
  91. };
  92. /**
  93. * 查询objectStore中所有的数据
  94. * @param {*} objectStoreName
  95. * @param {*} successCallback
  96. * @param {*} errorCallback
  97. * @returns
  98. */
  99. this.getAll = function (objectStoreName, successCallback, errorCallback) {
  100. let _self = this;
  101. if (_self.db == null) {
  102. errorCallback('数据库打开失败');
  103. return;
  104. }
  105. var transaction = _self.db.transaction([objectStoreName], 'readonly');
  106. var store = transaction.objectStore(objectStoreName);
  107. var cursor = store.openCursor();
  108. var datas = [];
  109. cursor.onsuccess = function (e) {
  110. var result = e.target.result;
  111. if (result && result !== null) {
  112. datas.push(result.value);
  113. result.continue();
  114. } else {
  115. successCallback(datas);
  116. }
  117. };
  118. cursor.onerror = errorCallback;
  119. };
  120. /**
  121. * 根据索引名称查询objectStore中所有的数据
  122. * @param {*} objectStoreName
  123. * @param {*} successCallback
  124. * @param {*} errorCallback
  125. * @returns
  126. */
  127. this.getAllByIndexName = function (objectStoreName, indexName, keyRange, successCallback, errorCallback) {
  128. let _self = this;
  129. if (_self.db == null) {
  130. errorCallback('数据库打开失败');
  131. return;
  132. }
  133. var transaction = _self.db.transaction([objectStoreName], 'readonly');
  134. var store = transaction.objectStore(objectStoreName);
  135. var index = store.index(indexName);
  136. //打开游标,通过IDBKeyRange设置游标范围,这里设置为只获取age等于18的数据
  137. var cursor = index.openCursor(keyRange);
  138. var datas = [];
  139. cursor.onsuccess = function (e) {
  140. var result = e.target.result;
  141. if (result && result !== null) {
  142. datas.push(result.value);
  143. result.continue();
  144. } else {
  145. successCallback(datas);
  146. }
  147. };
  148. cursor.onerror = errorCallback;
  149. }
  150. this.get = function (objectStoreName, id, successCallback, errorCallback) {
  151. let _self = this;
  152. if (_self.db == null) {
  153. errorCallback('数据库打开失败');
  154. return;
  155. }
  156. var transaction = _self.db.transaction([objectStoreName], 'readonly');
  157. var store = transaction.objectStore(objectStoreName);
  158. var request = store.get(id);
  159. request.onsuccess = function (e) {
  160. successCallback(e.target.result);
  161. };
  162. request.onerror = errorCallback;
  163. };
  164. /**
  165. * 删除一条数据
  166. * @param {*} id
  167. * @param {*} successCallback
  168. * @param {*} errorCallback
  169. * @returns
  170. */
  171. this.deleteOne = function (objectStoreName, id, successCallback, errorCallback) {
  172. let _self = this;
  173. if (_self.db == null) {
  174. errorCallback('数据库打开失败');
  175. return;
  176. }
  177. var transaction = _self.db.transaction([objectStoreName], 'readwrite');
  178. var store = transaction.objectStore(objectStoreName);
  179. var request = store.delete(id);
  180. request.onsuccess = successCallback;
  181. request.onerror = errorCallback;
  182. };
  183. this.deleteAll = function (objectStoreName, callback) {
  184. let _self = this;
  185. if (_self.db == null) {
  186. errorCallback('数据库打开失败');
  187. return;
  188. }
  189. var transaction = _self.db.transaction([objectStoreName], 'readwrite');
  190. var store = transaction.objectStore(objectStoreName);
  191. var request = store.clear();
  192. request.onsuccess = callback;
  193. }
  194. }