亚洲精品中文免费|亚洲日韩中文字幕制服|久久精品亚洲免费|一本之道久久免费

      
      

            <dl id="hur0q"><div id="hur0q"></div></dl>

                瀏覽器本地離線數(shù)據(jù)庫IndexedDB封裝

                let _IDBDatabase;//數(shù)據(jù)庫對象/** * 初始化或升級數(shù)據(jù)庫(動(dòng)態(tài)對比增刪改上一版本對象倉庫索引) * * @param {String} dbName 數(shù)據(jù)庫名稱 * @param {Number} dbVersion 數(shù)據(jù)庫版本 * @param {Array} objectStoreArr 對象倉庫名稱列表,格式如下:[{ name: ‘userStore’, index: [{ keys: ‘name,age’, unique: true }]}] * * @returns Promise對象,then(IDBDatabase) */export let initDB = (dbName, dbVersion, objectStoreArr) => new Promise((resolve, reject) => { let _IDBRequest = window.indexedDB.open(dbName, dbVersion); _IDBRequest.onsuccess = event => { _IDBDatabase = event.target.result; resolve(_IDBDatabase); }; _IDBRequest.onerror = event => reject(event); _IDBRequest.onupgradeneeded = event => { let oldObjectStoreNames = event.target.result.objectStoreNames; let newObjectStoreNames = objectStoreArr.map(o => o.name); if (oldObjectStoreNames.length === 0 && newObjectStoreNames && newObjectStoreNames.length > 0) //原對象倉庫為空,新對象倉庫不為空,直接添加新對象倉庫 for (let newObjectStoreName of newObjectStoreNames) { let newObjectStore = event.target.result.createObjectStore(newObjectStoreName, { keyPath: ‘id’ }); let newIndexArr = objectStoreArr.filter(o => o.name === newObjectStoreName)[0].index ?? []; for (let index of newIndexArr) newObjectStore.createIndex(index.keys, index.keys.split(‘,’), { unique: index.unique ?? false }); } else {//原對象倉庫不為空,則需要根據(jù)新舊對象倉庫對比情況,決定添加刪除或編輯 for (let oldObjectStoreName of oldObjectStoreNames) if (!newObjectStoreNames.some(newObjectStoreName => newObjectStoreName === oldObjectStoreName))//新對象倉庫中不存在的就對象倉庫,直接刪除 event.target.result.deleteObjectStore(oldObjectStoreName); newObjectStoreNames.forEach(newObjectStoreName => { if (oldObjectStoreNames.contains(newObjectStoreName)) {//新舊對象倉庫都存在的,編輯 let oldObjectStore = event.target.transaction.objectStore(newObjectStoreName); let newIndexArr = objectStoreArr.filter(o => o.name === newObjectStoreName)[0].index ?? []; let oldIndexNames = oldObjectStore.indexNames; let newIndexNames = newIndexArr.map(o => o.keys); for (let oldIndexName of oldIndexNames)//舊對象倉庫中存在索引,新對象倉庫中不存在的索引,刪除 if (!newIndexNames.some(newIndexName => newIndexName === oldIndexName)) oldObjectStore.deleteIndex(oldIndexName); for (let newIndexName of newIndexNames) //新對象倉庫中存在索引,舊對象倉庫中不存在索引,添加 if (!oldIndexNames.contains(newIndexName)) oldObjectStore.createIndex(newIndexName, newIndexName.split(‘,’), { unique: newIndexArr.filter(o => o.keys === newIndexName)[0].unique ?? false }); } else {//新對象倉庫有,舊對象倉庫沒有,添加 let newObjectStore = event.target.result.createObjectStore(newObjectStoreName, { keyPath: ‘id’ }); let newObjectStoreIndexs = objectStoreArr.filter(o => o.name === newObjectStoreName)[0].index ?? []; for (let index of newObjectStoreIndexs) newObjectStore.createIndex(index.keys, index.keys.split(‘,’), { unique: index.unique ?? false }); } }) } };});

                1.初始化或升級IDB,調(diào)用如下

                //調(diào)用示例initDB(“testDB”, 1, [{ name: ‘userStore’, index: [{ keys: ‘name,age’, unique: true }, { keys: ‘age’, unique: false }] }, { name: ‘scoreStore’ }]).then(res => { });


                2.添加數(shù)據(jù)

                /** * 添加數(shù)據(jù) * * @param {String} storeName 對象倉庫名稱 * @param {Object} data 對象數(shù)據(jù) * * @returns Promise對象,then(IDBRequest) */export let adData = (storeName, data) => new Promise((resolve, reject) => { let _IDBRequest = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName).add(data); _IDBRequest.onsuccess = event => resolve(event.target); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例for (let i = 1; i <= 100; i++) { adData('userStore', { id: i, name: '張三' + i, age: Math.floor((Math.random() * 10) + 10) })}


                3.刪除數(shù)據(jù)

                /** * 刪除數(shù)據(jù) * * @param {String} storeName 對象倉庫名稱 * @param {Number} id 對象數(shù)據(jù)id * * @returns Promise對象,then(IDBRequest) */export let rmDataById = (storeName, id) => new Promise((resolve, reject) => { let _IDBRequest = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName).delete(id); _IDBRequest.onsuccess = event => resolve(event.target); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例rmDataById(‘userStore’, 3).then(res => console.log(res));


                4.清空對象數(shù)據(jù)

                /** * 清空對象數(shù)據(jù) * * @param {String} storeName 對象倉庫名稱 * * @returns Promise對象,then(IDBRequest) */export let clearData = (storeName) => new Promise((resolve, reject) => { let _IDBRequest = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName).clear(); _IDBRequest.onsuccess = event => resolve(event.target); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例clearData(‘userStore’).then(res => console.log(res));


                5.對象倉庫記錄數(shù)據(jù)

                /** * 對象倉庫記錄數(shù) * * @param {String} storeName 對象倉庫名稱 * @param {IDBKeyRange} query IDBKeyRange(可選) * @param {String} indexKeys 索引keys(缺省為id,可選) * * @returns Promise對象,then(數(shù)據(jù)倉庫記錄數(shù)) */export let countData = (storeName, query, indexKeys) => new Promise((resolve, reject) => { let objectStore = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName); if (indexKeys) objectStore = objectStore.index(indexKeys); let _IDBRequest = query ? objectStore.count(query) : objectStore.count(); _IDBRequest.onsuccess = event => resolve(event.target.result); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例countData(‘userStore’, IDBKeyRange.bound([10], [12]), ‘age’).then(res => console.log(res));


                6.編輯數(shù)據(jù)

                /** * 編輯數(shù)據(jù) * * @param {String} storeName 對象倉庫名稱 * @param {Object} data 對象數(shù)據(jù) * @returns Promise對象,then(IDBRequest) */export let mdDataById = (storeName, data) => new Promise((resolve, reject) => { let _IDBRequest = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName).put(data); _IDBRequest.onsuccess = event => resolve(event.target); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例mdDataById(‘userStore’, { id: 2, name: ‘李四222’, age: 18 }).then(res => console.log(res))


                7.根據(jù)id查詢數(shù)據(jù)

                /** * 根據(jù)id查詢數(shù)據(jù) * * @param {String} storeName 對象倉庫名稱 * @param {Number} id 主鍵key * * @returns Promise對象,then(數(shù)據(jù)對象) */export let getDataById = (storeName, id) => new Promise((resolve, reject) => { let _IDBRequest = _IDBDatabase.transaction(storeName, ‘readwrite’).objectStore(storeName).get(id); _IDBRequest.onsuccess = event => resolve(event.target.result); _IDBRequest.onerror = event => reject(event);});//調(diào)用示例getDataById(‘userStore’, 5).then(res => console.log(res))


                8.查詢數(shù)據(jù)列表

                /** * 查詢數(shù)據(jù)列表(自定義索引的query參數(shù)為數(shù)組格式,IDBKeyRange.bound([10], [20])) * * @param {String} storeName 對象倉庫名稱 * @param {IDBKeyRange} query IDBKeyRange(可選) * @param {IDBCursorDirection} direction IDBCursorDirection枚舉類型:”next”,”nextunique”,”prev”,”prevunique”(可選) * @param {String} indexKeys 索引keys(缺省為id,可選) * * @returns Promise對象,then(數(shù)據(jù)對象數(shù)組) */export let queryData = (storeName, query, direction, indexKeys) => new Promise((resolve, reject) => { let objectStore = _IDBDatabase.transaction(storeName).objectStore(storeName); if (indexKeys) objectStore = objectStore.index(indexKeys); let _IDBRequest = query ? (direction ? objectStore.openCursor(query, direction) : objectStore.openCursor(query)) : objectStore.openCursor(); let arr = []; _IDBRequest.onsuccess = event => { let cursor = event.target.result if (cursor) { arr.push(cursor.value); cursor.continue(); } else resolve(arr); }; _IDBRequest.onerror = event => reject(event);});//調(diào)用示例queryData(‘userStore’, IDBKeyRange.bound(1, 11, false, true)).then(res => console.log(res));


                9.分頁查詢

                /** * 分頁查詢 * * @param {String} storeName 對象倉庫名稱 * @param {Number} pageNo 頁碼 * @param {Number} pageSize 頁面大小 * @param {IDBKeyRange} query IDBKeyRange(可選) * @param {IDBCursorDirection} direction IDBCursorDirection枚舉類型:”next”,”nextunique”,”prev”,”prevunique”(可選) * @param {String} indexKeys 索引keys(缺省為id,可選) * @returns Promise對象,then(分頁數(shù)據(jù) total、pages、data) */export let queryPage = (storeName, pageNo, pageSize, query, direction, indexKeys) => countData(storeName, query, indexKeys).then(total => new Promise((resolve, reject) => { let pages = 0, data = [], objectStore = _IDBDatabase.transaction(storeName).objectStore(storeName); if (indexKeys) objectStore = objectStore.index(indexKeys); let _IDBRequest = query ? (direction ? objectStore.openCursor(query, direction) : objectStore.openCursor(query)) : objectStore.openCursor(); let isAdvance = true; _IDBRequest.onsuccess = event => { let cursor = event.target.result if (cursor) { if (isAdvance && data.length === 0 && pageNo > 1) { isAdvance = false; cursor.advance((pageNo – 1) * pageSize); } else { data.push(cursor.value); if (data.length === pageSize) { resolve({ total: total, pages: Math.ceil(total / pageSize), data: data }) return; } cursor.continue(); } } else resolve({ total: total, pages: pages, data: data }) }; _IDBRequest.onerror = event => reject(event);}));//調(diào)用示例queryPage(‘userStore’, 1, 9).then(res => console.log(res))


                10.關(guān)閉數(shù)據(jù)庫

                /** * 關(guān)閉數(shù)據(jù)庫 * * @returns void */export let closeDB = () => _IDBDatabase.close();//調(diào)用示例closeDB()

                鄭重聲明:本文內(nèi)容及圖片均整理自互聯(lián)網(wǎng),不代表本站立場,版權(quán)歸原作者所有,如有侵權(quán)請聯(lián)系管理員(admin#wlmqw.com)刪除。
                用戶投稿
                上一篇 2022年6月14日 09:07
                下一篇 2022年6月14日 09:07

                相關(guān)推薦

                • 存儲(chǔ)過程語法(sql server存儲(chǔ)過程語法)

                  今天小編給各位分享存儲(chǔ)過程語法的知識,其中也會(huì)對sql server存儲(chǔ)過程語法進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! oracle存儲(chǔ)過程基本語法…

                  2022年11月26日
                • 京東快遞跨省幾天能到(京東一般多久到貨)

                  由于覺得京東平臺的物流效勞十分的不錯(cuò),而且商品的質(zhì)量都比擬有保證。在京東平臺購物的話,普通多久時(shí)間會(huì)到貨?下面的內(nèi)容停止引見。 京東普通多久到貨? 詳細(xì)要看發(fā)貨地址和你所在的地址的…

                  2022年11月26日
                • 地靈絕魂劍(地靈絕魂劍像素)

                  今天小編給各位分享地靈絕魂劍的知識,其中也會(huì)對地靈絕魂劍像素進(jìn)行解釋,如果能碰巧解決你現(xiàn)在面臨的問題,別忘了關(guān)注本站,現(xiàn)在開始吧! dnf地靈絕魂劍怎么計(jì)算 地靈絕魂劍的附加攻擊是…

                  2022年11月25日
                • 什么是推廣cpa一篇文章帶你看懂CPA推廣渠道

                  CPA渠道 CPA指的是按照指定的行為結(jié)算,可以是搜索,可以是注冊,可以是激活,可以是搜索下載激活,可以是綁卡,實(shí)名認(rèn)證,可以是付費(fèi),可以是瀏覽等等。甲乙雙方可以根據(jù)自己的情況來定…

                  2022年11月25日
                • 抖音直播帶貨有哪些方法技巧(抖音直播帶貨有哪些痛點(diǎn))

                  如今抖音這個(gè)短視頻的變現(xiàn)能力越來越突顯了,尤其是在平臺上開通直播,更具有超強(qiáng)的帶貨屬性,已經(jīng)有越來越多的普通人加入到其中了。不過直播帶貨雖然很火,但是也不是每個(gè)人都能做好的,那么在…

                  2022年11月24日
                • 華為手機(jī)怎么掃一掃連接wifi(手機(jī)掃一掃在哪里)

                  手機(jī)瀏覽器可以用來瀏覽網(wǎng)頁、看新聞、看視頻,還能搜索問題,在我們的工作生活中瀏覽器占據(jù)著非常重要的位置。手機(jī)瀏覽器除了這些作用,其實(shí)它隱藏著其他功能,比如:掃一掃。掃一掃可不只是用…

                  2022年11月24日
                • 明查|美國新冠后遺癥患者中有16%癥狀嚴(yán)重以致無法工作?

                  點(diǎn)擊進(jìn)入澎湃新聞全球事實(shí)核查平臺 速覽 – 網(wǎng)傳數(shù)據(jù)比例無權(quán)威信源佐證,該比例有可能是結(jié)合了美國疾病防控中心和布魯金斯學(xué)會(huì)的數(shù)據(jù)得出,但這兩個(gè)機(jī)構(gòu)的調(diào)研目的和樣本都不同…

                  2022年11月24日
                • 手機(jī)瀏覽器哪個(gè)好用(手機(jī)瀏覽器哪個(gè)好用?)

                  本文主要講的是手機(jī)瀏覽器哪個(gè)好用,以及和手機(jī)瀏覽器哪個(gè)好用?相關(guān)的知識,如果覺得本文對您有所幫助,不要忘了將本文分享給朋友。 手機(jī)瀏覽器哪個(gè)好? 1、百度瀏覽器 百度瀏覽器是眾多瀏…

                  2022年11月21日
                • 淘寶運(yùn)營數(shù)據(jù)分析的3個(gè)指標(biāo)解析(運(yùn)營數(shù)據(jù)分析怎么做)

                  我們知道淘寶運(yùn)營工作中對于數(shù)據(jù)的分析與整理是很重要的,這些工作乍一聽可能比較難,但是也有一些相關(guān)的技巧可以讓我們能夠有效的找出對我們有用的數(shù)據(jù),這樣我們也能夠更加直觀的看出我們店鋪…

                  2022年11月20日
                • 蘋果用夸克怎么下載視頻 夸克視頻保存路徑在哪個(gè)文件夾

                  夸克瀏覽器上的資源非常的豐富,蘋果用戶下載了夸克瀏覽器APP以后可以使用直接使用夸克下載自己喜歡的視頻,那么蘋果用戶使用夸克瀏覽器下載視頻呢?下面一起來看看吧! 蘋果怎么用夸克瀏覽…

                  2022年11月18日

                聯(lián)系我們

                聯(lián)系郵箱:admin#wlmqw.com
                工作時(shí)間:周一至周五,10:30-18:30,節(jié)假日休息