indexedDb.js 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236
  1. // 初始化数据库函数
  2. export async function initDatabase() {
  3. try {
  4. const db = await new Promise((resolve, reject) => {
  5. const request = indexedDB.open("FileDataDB");
  6. request.onsuccess = (event) => resolve(event.target.result);
  7. request.onerror = (event) => reject(event.target.error);
  8. });
  9. return db;
  10. } catch (error) {
  11. console.error("Failed to open IndexedDB:", error);
  12. return null; // 可以返回默认值,如 null,避免影响页面
  13. }
  14. }
  15. // 判断是否存在这个数据库及表
  16. export function checkObjectStoreExists(dbName, storeName) {
  17. return new Promise((resolve, reject) => {
  18. const request = indexedDB.open(dbName);
  19. request.onsuccess = (event) => {
  20. const db = event.target.result;
  21. const storeExists = db.objectStoreNames.contains(storeName);
  22. db.close();
  23. resolve(storeExists);
  24. };
  25. request.onerror = (event) => {
  26. console.error("Database open failed:", event.target.error);
  27. resolve(false); // 错误发生时返回 false,避免影响页面
  28. };
  29. });
  30. }
  31. // 获取 IndexedDB 所有数据
  32. export async function getDataFromIndexedDB() {
  33. return new Promise((resolve, reject) => {
  34. const request = indexedDB.open("FileDataDB");
  35. request.onsuccess = (event) => {
  36. const db = event.target.result;
  37. const transaction = db.transaction(["files"], "readonly");
  38. const store = transaction.objectStore("files");
  39. const getRequest = store.getAll();
  40. getRequest.onsuccess = () => {
  41. if (getRequest.result && getRequest.result.length > 0) {
  42. const fileData = getRequest.result.find(
  43. (item) => item.id === "fileDataArray"
  44. );
  45. resolve(fileData ? fileData.data : []); // 返回文件数据或空数组
  46. } else {
  47. resolve([]); // 数据库为空时返回空数组
  48. }
  49. };
  50. getRequest.onerror = (event) => {
  51. console.error(
  52. "Failed to retrieve data from IndexedDB:",
  53. event.target.error
  54. );
  55. resolve([]); // 错误发生时返回空数组,避免影响页面展示
  56. };
  57. };
  58. request.onerror = (event) => {
  59. console.error("Failed to open IndexedDB:", event.target.error);
  60. resolve([]); // 错误发生时返回空数组
  61. };
  62. });
  63. }
  64. // 清除 FileDataDB 整个对象存储
  65. export async function clearAllDataFromIndexedDB() {
  66. return new Promise((resolve, reject) => {
  67. const versionRequest = indexedDB.open("FileDataDB");
  68. versionRequest.onsuccess = (event) => {
  69. const db = event.target.result;
  70. if (!db.objectStoreNames.contains("files")) {
  71. console.log("Object store 'files' does not exist. No action needed.");
  72. db.close();
  73. return resolve();
  74. }
  75. const currentVersion = db.version;
  76. db.close();
  77. const request = indexedDB.open("FileDataDB", currentVersion);
  78. request.onsuccess = (event) => {
  79. const db = event.target.result;
  80. const transaction = db.transaction(["files"], "readwrite");
  81. const store = transaction.objectStore("files");
  82. const clearRequest = store.clear();
  83. clearRequest.onsuccess = () => {
  84. console.log("All data cleared from IndexedDB.");
  85. resolve();
  86. };
  87. clearRequest.onerror = (event) => {
  88. console.error(
  89. "Failed to clear data from IndexedDB:",
  90. event.target.error
  91. );
  92. reject(event.target.error); // 错误发生时拒绝 Promise
  93. };
  94. };
  95. request.onerror = (event) => {
  96. console.error("Failed to open IndexedDB:", event.target.error);
  97. reject(event.target.error);
  98. };
  99. };
  100. versionRequest.onerror = (event) => {
  101. console.error("Failed to retrieve database version:", event.target.error);
  102. reject(event.target.error);
  103. };
  104. });
  105. }
  106. // 清除 myIndexedDB 整个对象存储
  107. export const clearMyIndexedDBIndexedDB = () => {
  108. const dbName = "myIndexedDB";
  109. const request = indexedDB.open(dbName);
  110. request.onsuccess = (event) => {
  111. const db = event.target.result;
  112. try {
  113. const transaction = db.transaction(db.objectStoreNames, "readwrite");
  114. for (const storeName of db.objectStoreNames) {
  115. if (storeName.startsWith("vuexData")) {
  116. const objectStore = transaction.objectStore(storeName);
  117. objectStore.clear().onsuccess = () => {
  118. console.log(`Cleared all data in ${storeName}`);
  119. };
  120. }
  121. }
  122. transaction.oncomplete = () => {
  123. console.log("All vuexData tables cleared.");
  124. db.close();
  125. };
  126. } catch (e) {
  127. console.log(e);
  128. }
  129. };
  130. request.onerror = (event) => {
  131. console.error("Failed to open IndexedDB:", event.target.error);
  132. };
  133. };
  134. // 往 IndexedDB 某一个表里添加一条数据
  135. export async function storeSetData(db, storeName, key, newFileData, callback) {
  136. if (!db) {
  137. console.error("Database is not initialized.");
  138. return;
  139. }
  140. const transaction = db.transaction([storeName], "readwrite");
  141. const store = transaction.objectStore(storeName);
  142. const getRequest = store.get(key);
  143. getRequest.onsuccess = () => {
  144. const fileDataArray = getRequest.result ? getRequest.result.data : [];
  145. console.log("Current fileDataArray:", fileDataArray);
  146. fileDataArray.push(newFileData);
  147. const putRequest = store.put({
  148. id: key,
  149. data: fileDataArray,
  150. });
  151. putRequest.onsuccess = () => {
  152. console.log("Data successfully saved to IndexedDB");
  153. if (callback && typeof callback === "function") {
  154. callback();
  155. }
  156. };
  157. putRequest.onerror = (event) => {
  158. console.error("Error updating data in IndexedDB:", event.target.error);
  159. };
  160. };
  161. getRequest.onerror = (event) => {
  162. console.error("Error retrieving data from IndexedDB:", event.target.error);
  163. };
  164. }
  165. // 打开数据库
  166. export async function openDB(dbName, version) {
  167. return new Promise((resolve, reject) => {
  168. const request = indexedDB.open(dbName, version);
  169. request.onsuccess = () => resolve(request.result);
  170. request.onerror = (event) => {
  171. console.error("Error opening database:", event.target.error);
  172. reject(event.target.error);
  173. };
  174. request.onupgradeneeded = (event) => {
  175. const db = event.target.result;
  176. if (!db.objectStoreNames.contains("vuexData")) {
  177. db.createObjectStore("vuexData", { keyPath: "key" });
  178. }
  179. };
  180. });
  181. }
  182. // 保存数据
  183. export async function saveData(dbName, key, value) {
  184. const db = await openDB(dbName, 1);
  185. return new Promise((resolve, reject) => {
  186. const transaction = db.transaction(["vuexData"], "readwrite");
  187. const store = transaction.objectStore("vuexData");
  188. const request = store.put({ key, value });
  189. request.onsuccess = () => resolve(true);
  190. request.onerror = (event) => reject(event.target.error);
  191. });
  192. }
  193. // 获取数据
  194. export async function getData(dbName, key) {
  195. const db = await openDB(dbName, 1);
  196. return new Promise((resolve, reject) => {
  197. const transaction = db.transaction(["vuexData"], "readonly");
  198. const store = transaction.objectStore("vuexData");
  199. const request = store.get(key);
  200. request.onsuccess = () => resolve(request.result?.value || null);
  201. request.onerror = (event) => reject(event.target.error);
  202. });
  203. }