/** * @Description 数据库工具 * @Author ZPFly * @Date 2021/10/12 */ class DbService { private dbName = "creditDb"; private dbVersion = 1; private db: any; //name:表名 key:主键 ,cursorIndex 索引 store = { sysDict: { name: "sysDict", key: "dictId", cursorIndex: [{ name: "dictField", unique: false }] }, multiMedia: { name: "multiMedia", key: "id", autoIncrement: true, cursorIndex: [{ name: "objId", unique: false }] }, }; initDB() { const store: any = this.store; const request = indexedDB.open(this.dbName, this.dbVersion); return new Promise((resolve) => { request.onerror = function () { console.log("打开数据库失败"); }; request.onsuccess = (event: any) => { console.log("打开数据库成功"); this.db = event.target.result; resolve(true); }; request.onupgradeneeded = (event: any) => { const db = event.target.result; for (const t in store) { if (!db.objectStoreNames.contains(store[t].name)) { const objectStore = db.createObjectStore(store[t].name, { keyPath: store[t].key, autoIncrement: !!store[t].autoIncrement, }); for (let i = 0; i < store[t].cursorIndex.length; i++) { const element = store[t].cursorIndex[i]; objectStore.createIndex(element.name, element.name, { unique: element.unique, }); } } } console.log("数据库升级完成"); }; }); } // 打开数据库 await this.openDB(); private openDB() { return new Promise((resolve, reject) => { const request = indexedDB.open(this.dbName, this.dbVersion); request.onerror = function (event) { reject("IndexedDB数据库打开错误," + event); }; request.onsuccess = function (event: any) { resolve(event.target.result); }; }); } // 添加数据,add添加新值 async insert(table: string, data: any) { try { // const db: any = await this.openDB(); const request = this.db.transaction(table, "readwrite").objectStore(table); return new Promise((resolve) => { request.add(data); request.onerror = function () { console.error("添加数据出错"); resolve("添加数据出错"); }; request.onsuccess = function () { resolve(true); }; }); } catch (error) { console.log(error); return Promise.resolve(false); } } // 批量添加数据,add添加新值 async batInsert(table: string, values: Array) { try { // const db: any = await this.openDB(); const request = this.db.transaction(table, "readwrite").objectStore(table); return new Promise((resolve) => { for (const data of values) { request.add(data); } request.onerror = function () { console.error("添加数据出错"); resolve("添加数据出错"); }; request.onsuccess = function () { resolve(true); }; }); } catch (error) { console.log(error); return Promise.resolve(false); } } // 更新 async update(table: string, values: Array) { try { const db: any = await this.openDB(); const request = db.transaction(table, "readwrite").objectStore(table); return new Promise((resolve) => { for (const data of values) { request.put(data); } request.onerror = function () { console.log("数据更新失败"); resolve(false); }; request.onsuccess = function (e: any) { console.log(e); console.log("数据更新成功"); // resolve(true); }; }); } catch (error) { return Promise.resolve(false); } } // 删除数据 async delete(table: string, keyValue: any) { try { // const db: any = await this.openDB(); const request: any = this.db.transaction(table, "readwrite").objectStore(table).delete(keyValue); return new Promise((resolve) => { request.onerror = function () { resolve(false); }; request.onsuccess = function () { resolve(true); }; }); } catch (error) { return Promise.resolve(false); } } // 查询数据 表名 索引值 索引 key 没有value key为key 而不是索引 async get(table: string, keyValue?: any, indexCursor?: string) { try { // const db: any = await this.openDB(); const store = this.db.transaction(table, "readonly").objectStore(table); const request: any = !keyValue ? store.openCursor() : indexCursor ? store.index(indexCursor).openCursor(keyValue) : store.get(keyValue); const data: any = []; return new Promise((resolve) => { request.onerror = function () { resolve("查询数据失败"); }; request.onsuccess = function (event: any) { if (indexCursor) { if (event.target.result) { console.log(event.target.result.value); data.push(event.target.result.value); event.target.result.continue(); } else { resolve(data); } } else { resolve(event.target.result); } }; }); } catch (error) { return Promise.reject(error); } } // 通过索引游标操作数据, callback中要有游标移动方式 async handleDataByIndex(table: string, keyRange: any, cursorIndex?: string) { try { const kRange = keyRange || ""; // const db: any = await this.openDB(); const store: any = this.db.transaction(table, "readwrite").objectStore(table); const request: any = store.index(cursorIndex).openCursor(kRange); return new Promise((resolve) => { request.onerror = function () { resolve("通过索引游标获取数据报错"); }; request.onsuccess = function (event: any) { const cursor = event.target.result; if (cursor) { resolve(cursor); } }; }); } catch (error) { return Promise.reject(error); } } // 清空数据 async clear(table: string) { // const db: any = await this.openDB(); const store = this.db.transaction(table, "readwrite").objectStore(table); store.clear(); } // 删除表 deleteTable(table: string) { const deleteQuest = indexedDB.deleteDatabase(table); return new Promise((resolve) => { deleteQuest.onerror = function () { resolve(false); }; deleteQuest.onsuccess = function () { resolve(true); }; }); } } const dbService = new DbService(); export default dbService;