<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      IndexedDB封裝

      重點

      數據庫初始創建或更新后會先觸發onupgradeneeded方法,然后再觸發onsuccess方法,如果在onupgradeneeded方法中執行了表結構操作的話,onsuccess會在transaction.oncomplete事件處理之后觸發,所以在onsuccess方法中去執行增刪改一定是在表完整結構基礎上不必擔心表錯誤

      代碼

      export default class IndexedDB {
        /** 表名 */
        private tableName: string;
      
        /** 鍵列表,第一個為主鍵,其余為索引鍵 */
        private keyList: string[];
      
        /** 等待連接數據庫的 Promise */
        awaitOpenDB: Promise<IDBDatabase>;
      
        // 構造方法
        constructor(
          tableName: 'indexedTable',
          keyList: string[],
          dbName: 'indexedDB'
        ) {
          this.tableName = tableName;
          this.keyList = keyList;
          this.awaitOpenDB = this.openDB(dbName);
        }
      
        /** 連接數據庫并返回 Promise */
        private openDB(dbName: string): Promise<IDBDatabase> {
          return new Promise((resolve, reject) => {
            const request = window.indexedDB.open(dbName);
            // 創建或更新數據庫時調用
            request.onupgradeneeded = (e) =>
              this.initDB((e.target as IDBOpenDBRequest).result);
            // 連接成功
            request.onsuccess = (e) => resolve((e.target as IDBOpenDBRequest).result);
            // 連接失敗
            request.onerror = (e) => reject((e.target as IDBOpenDBRequest).error);
          });
        }
      
        /** 初始化數據庫 */
        private initDB(db: IDBDatabase) {
          // 拆出主鍵和索引鍵
          const [keyPath, ...otherKey] = this.keyList;
          // 創建創建對象存儲(表)和主鍵
          const objStore = db.createObjectStore(this.tableName, {
            keyPath: keyPath || 'id',
            autoIncrement: true,
          });
          // 創建索引
          otherKey.forEach((key) => {
            if (!objStore.indexNames.contains(key)) {
              objStore.createIndex(key, key, { unique: false });
            }
          });
        }
      
        /** 設置一條數據 */
        private async setItem(obj: Record<string, any>): Promise<void> {
          const db = await this.awaitOpenDB;
          return new Promise((resolve, reject) => {
            const request = db
              .transaction([this.tableName], 'readwrite')
              .objectStore(this.tableName)
              .put(obj); // 插入或更新數據
            request.onsuccess = () => resolve();
            request.onerror = () => reject(new Error('設置數據失敗'));
          });
        }
      
        /** 設置數據 */
        public async setData(list: Array<Record<string, any>> | Record<string, any>) {
          const arr = Array.isArray(list) ? list : [list]; // 統一處理為數組
          return Promise.allSettled(arr.map((v) => this.setItem(v)));
        }
      
        /** 獲取數據 */
        public async getData(
          obj: Record<string, any>
        ): Promise<Array<Record<string, any>>> {
          const db = await this.awaitOpenDB;
          const objectStore = db
            .transaction(this.tableName)
            .objectStore(this.tableName);
          const objKeyList = Object.keys(obj); // 獲取查詢條件的鍵
          const results: Array<Record<string, any>> = [];
          return new Promise((resolve) => {
            objectStore.openCursor().onsuccess = (event) => {
              const cursor = (event.target as IDBRequest).result;
              if (cursor) {
                if (objKeyList.every((v) => obj[v] === cursor.value[v])) {
                  results.push(cursor.value); // 匹配則添加到結果中
                }
                cursor.continue(); // 繼續遍歷
              } else {
                resolve(results); // 遍歷結束,返回結果
              }
            };
          });
        }
      
        /** 通過主鍵刪除數據 */
        public async removeItem(keyPath: string): Promise<void> {
          const db = await this.awaitOpenDB;
          return new Promise((resolve, reject) => {
            const request = db
              .transaction([this.tableName], 'readwrite')
              .objectStore(this.tableName)
              .delete(keyPath); // 根據主鍵刪除數據
            request.onsuccess = () => resolve();
            request.onerror = () => reject(new Error('刪除數據失敗'));
          });
        }
      
        /** 刪除符合條件的數據 */
        public async removeData(obj: Record<string, any>) {
          // 由于只能通過主鍵刪除數據,所以要先根據條件進行查詢,后逐條進行刪除操作
          const res = await this.getData(obj);
          return Promise.allSettled(
            res.map((v) => this.removeItem(v[this.keyList[0]]))
          );
        }
      }
      

      使用

      storageDB = new indexedDB('表名',['id','name'],'庫名')
      // indexedDBClass中參數都非必填
      // 默認表名indexedTable
      // 默認表名字段列表['id']
      // 默認庫名indexedDB
      // 使用數據庫的代碼都要在這里面運行,不然會出現數據庫未鏈接就使用的情況
      // 獲取數據(參數是匹配條件)
      let list = await storageDB.getData({ name: '張三' })
      // 新增&插入數據(參數是完整的要存儲的數據)
      await storageDB.setData({ name: '李四' })
      // 刪除數據(參數是匹配條件)
      await storageDB.removeData({ name: '張三' })
      })
      

      評價

      indexedDb有點類似于storage的存儲方式,特別是在存取單條數據的時候幾乎寫法大差不差
      對于批量操作沒有任何可用的api,只能化整為零逐條操作
      查詢功能更是一塌糊涂,僅支持單個鍵全匹配或者獲取全部,是不是跟storage獲取超級相似,跟sql庫完全沒有可比性

      posted @ 2023-11-21 11:06  杜柯楓  閱讀(174)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 黑人巨大无码中文字幕无码| 亚洲高清国产自产拍av| 国产日韩入口一区二区| xxxxbbbb欧美残疾人| 久久精品夜夜夜夜夜久久| 精品国产一区二区三区四区| 亚洲av日韩在线资源| 中文无码精品a∨在线| 色悠悠国产精品免费观看| 午夜AAAAA级岛国福利在线 | 中文字幕日本一区二区在线观看| 成年午夜免费韩国做受视频| 国产成人精品成人a在线观看| 欧美三级在线播放| 一区二区亚洲精品国产精| 99RE8这里有精品热视频| 亚洲国产精品人人做人人爱| 毛葺葺老太做受视频| 在线天堂中文新版www| 狠狠色婷婷久久综合频道日韩| 人妻无码| 在线观看热码亚洲AV每日更新| 久久综合97丁香色香蕉| 国产一级特黄高清大片一| 亚洲精品欧美综合二区| 免费国产一级 片内射老| 国产精品一区二区三区91| 日韩精品一区二区三区激情视频| 精品久久久久久无码不卡| 久久夜色国产噜噜亚洲av| 久久国产精品老女人| 天天做天天爱夜夜夜爽毛片| 久久精品无码鲁网中文电影| 日本道不卡一二三区视频| 国产精品户外野外| 亚洲欧美日韩人成在线播放| 人妻日韩人妻中文字幕| 日韩加勒比一本无码精品| 大又大又粗又硬又爽少妇毛片| 日韩亚洲国产综合高清| 中文熟妇人妻av在线|