You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

166 regels
5.4 KiB

  1. const indexDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB
  2. class IndexDBCache {
  3. // 构造函数
  4. constructor() {
  5. this._db = null //数据库
  6. this._transaction = null //事务
  7. this._request = null
  8. this._dbName = 'hxz' //数据库名
  9. this._cacheTableName = 'tableOption' //表名
  10. this._keyPath = 'tableIdName'
  11. this._dbversion = 1 //数据库版本
  12. }
  13. // 初始化数据库
  14. initDB() {
  15. return new Promise((resolve, reject) => {
  16. this._request = indexDB.open(this._dbName, this._dbversion) // 打开数据库
  17. // 数据库初始化成功
  18. this._request.onsuccess = (event) => {
  19. this._db = this._request.result
  20. resolve(event)
  21. }
  22. // 数据库初始化失败
  23. this._request.onerror = (event) => {
  24. reject(event)
  25. }
  26. // 数据库初次创建或更新时会触发
  27. this._request.onupgradeneeded = (event) => {
  28. let db = this._request.result
  29. if (!db.objectStoreNames.contains(this._cacheTableName)) {
  30. db.createObjectStore(this._cacheTableName, {
  31. keyPath: this._keyPath, // 设置主键
  32. })
  33. }
  34. resolve(event)
  35. }
  36. })
  37. }
  38. /**
  39. * @description : 新增数据
  40. * @param {Object} params { tableName, optionData } //两个参数
  41. * @return {*}
  42. */
  43. addData(params) {
  44. params.optionData = JSON.stringify(params.optionData, this.serialize)
  45. return new Promise((resolve, reject) => {
  46. let transaction = this._db.transaction(this._cacheTableName, 'readwrite')
  47. let store = transaction.objectStore(this._cacheTableName)
  48. let response = store.add(params)
  49. // 操作成功
  50. response.onsuccess = (event) => {
  51. resolve(event)
  52. }
  53. // 操作失败
  54. response.onerror = (event) => {
  55. reject(event)
  56. }
  57. })
  58. }
  59. // 通过主键读取数据
  60. getDataByKey(key) {
  61. return new Promise((resolve, reject) => {
  62. let transaction = this._db.transaction(this._cacheTableName)
  63. let objectStore = transaction.objectStore(this._cacheTableName)
  64. // 通过主键读取数据
  65. let request = objectStore.get(key)
  66. // 操作成功
  67. request.onsuccess = () => {
  68. if (request.result) {
  69. request.result.optionData = JSON.parse(request.result.optionData, this.deserialize)
  70. resolve(request.result)
  71. } else {
  72. reject("获取失败")
  73. }
  74. }
  75. // 操作失败
  76. request.onerror = (event) => {
  77. reject(event)
  78. }
  79. })
  80. }
  81. /**
  82. * @description : 更新数据
  83. * @param {Object} params
  84. * @return {*}
  85. */
  86. upDate(params) {
  87. params.optionData = JSON.stringify(params.optionData, this.serialize)
  88. return new Promise((resolve, reject) => {
  89. let transaction = this._db.transaction(this._cacheTableName, 'readwrite')
  90. let store = transaction.objectStore(this._cacheTableName)
  91. let response = store.put(params)
  92. // 操作成功
  93. response.onsuccess = (event) => {
  94. resolve(event)
  95. }
  96. // 操作失败
  97. response.onerror = (event) => {
  98. reject(event)
  99. }
  100. })
  101. }
  102. // 获取所有数据
  103. getAllDate() {
  104. return new Promise((resolve, reject) => {
  105. let transaction = this._db.transaction(this._cacheTableName, 'readwrite')
  106. let store = transaction.objectStore(this._cacheTableName)
  107. let response = store.getAll()
  108. // 操作成功
  109. response.onsuccess = (event) => {
  110. console.log(event, 'adsklasjdkalsjdklasjdklasjkdls')
  111. resolve(event)
  112. }
  113. // 操作失败
  114. response.onerror = (event) => {
  115. reject(event)
  116. }
  117. })
  118. }
  119. // 使用string调用 JSON.stringify(obj, serialize)
  120. serialize(key, value) {
  121. if (typeof value === 'function') {
  122. return value.toString();
  123. }
  124. return value;
  125. }
  126. // 使用parse调用 JSON.parse(obj, deserialize)
  127. deserialize(key, value) {
  128. if (value && typeof value === "string" && value.substr(0, 8) == "function") {
  129. var startBody = value.indexOf('{') + 1;
  130. var endBody = value.lastIndexOf('}');
  131. var startArgs = value.indexOf('(') + 1;
  132. var endArgs = value.indexOf(')');
  133. return new Function(value.substring(startArgs, endArgs), value.substring(startBody, endBody));
  134. }
  135. return value;
  136. }
  137. // 删除indexDB
  138. deleteDB(id) {
  139. let transaction = this._db.transaction(this._cacheTableName, 'readwrite')
  140. let store = transaction.objectStore(this._cacheTableName)
  141. let request = store.delete(id)
  142. request.onsuccess = function() {
  143. console.log('数据删除成功')
  144. }
  145. request.onerror = function() {
  146. console.log('数据删除失败')
  147. }
  148. }
  149. }
  150. export default IndexDBCache