標籤:

HTML5本地存儲——IndexedDB

IndexedDB 是一種低級API,用於客戶端存儲大量結構化數據(包括, 文件/ blobs)。該API使用索引來實現對該數據的高性能搜索。

最近有一項業務需求,就是可以離線存儲數據,等到有網路信號的時候可以上傳表單和圖片。所以研究了一下HTML5的IndexedDB。

對於只存儲某些欄位的需求來說,可以使用Local Storage和 Session Storage來完成。但是一旦存儲大量的數據,Local Storage和 Session Storage就遠遠不能滿足需求了。這時,IndexedDB的強大之處就會體現出來了。

1、創建或者打開資料庫

/* 對不同瀏覽器的indexedDB進行兼容 */nconst indexeddb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.msIndexedDB;n/* 創建或連接資料庫 */nconst request = indexeddb.open(name, version); // name:資料庫名,version:資料庫版本號n

因為indexedDB在不同的瀏覽器上有兼容性,所以我們需要些一個兼容函數來兼容indexedDB。

2、連接到資料庫的回調函數

request.addEventListener(success, function(event){ n // 打開或創建資料庫成功n}, false);nnrequest.addEventListener(error, function(event){ n // 打開或創建資料庫失敗n}, false);nnrequest.addEventListener(upgradeneeded, function(event){ n // 更新資料庫時執行n}, false);n

在連接到資料庫後,request會監聽三種狀態:

success:打開或創建資料庫成功

error:打開或創建資料庫失敗

upgradeneeded:更新資料庫

upgradeneeded狀態是在indexedDB創建新的資料庫時和indexeddb.open(name, version) version(資料庫版本號)發生變化時才能監聽到此狀態。當版本號不發生變化時,不會觸發此狀態。資料庫的ObjectStore的創建、刪除等都是在這個監聽事件下執行的。

3、創建、刪除ObjectStore

在indexedDB中,ObjectStore類似於資料庫的表。

request.addEventListener(upgradeneeded, function(event){ n // 創建資料庫實例n const db = event.target.result;nn // 關閉資料庫n db.close();n n // 判斷是否有ObjectStoren db.objectStoreNames.contains(objectStoreName);n n // 刪除ObjectStoren db.deleteObjectStore(objectStoreName);n n}, false);n

可以用如下方法創建一個ObjectStore

request.addEventListener(upgradeneeded, function(event){ n // 創建資料庫實例n const db = event.target.result;n n // 判斷是否有ObjectStoren if(!db.objectStoreNames.contains(objectStoreName)){n const store = db.createObjectStore(objectStoreName, {n keyPath: keyPath // keyPath 作為ObjectStore的搜索關鍵字n });n n // 為ObjectStore創造索引n store.createIndex(name, // 索引n index, // 鍵值n {n unique: unique // 索引是否唯一n });n }n n}, false);n

4、數據的增刪改查

request.addEventListener(success, function(event){ n // 創建資料庫實例n const db = event.target.result;n n // 查找一個ObjectStoren db.transaction(objectStoreName, wa);n // wa為readwrite時,數據可以讀寫 n // wa為readonly時,數據只讀n const store = transaction.objectStore(objectStoreName);n}, false);n

資料庫的增刪改查:

// 添加數據,當關鍵字存在時數據不會添加nstore.add(obj);n// 更新數據,當關鍵字存在時覆蓋數據,不存在時會添加數據nstore.put(obj);n// 刪除數據,刪除指定的關鍵字對應的數據nstore.delete(value);n// 清除ObjectStorenstore.clear();n// 查找數據,根據關鍵字查找指定的數據nconst g = store.get(value);ng.addEventListener(success, function(event){n // 非同步查找後的回調函數n}, false);n

按索引查找數據

const index = store.index(indexName);nconst cursor = index.openCursor(range);nncursor.addEventListener(success, function(event){n const result = event.target.result;n if(result){n result.value // 數據n result.continue(); // 迭代,游標下移n }n}, false);n

按索引的範圍查找數據

const index = store.index(indexName);nconst cursor = index.openCursor(range);n/**n * range為null時,查找所有數據n * range為指定值時,查找索引滿足該條件的對應的數據n * range為IDBKeyRange對象時,根據條件查找滿足條件的指定範圍的數據n */nn// 大於或大於等於 nrange = IDBKeyRange.lowerBound(value, true) // (value, +∞),> valuenrange = IDBKeyRange.lowerBound(value, false) // [value, +∞),>= valuen// 小於或小於等於,isOpen:true,開區間;false,閉區間nrange = IDBKeyRange.upperBound(value, isOpen)n// 大於或大於等於value1,小於或小於等於value2nIDBKeyRange.bound(value1, value2, isOpen1, isOpen2)n

最後,自己封裝了一個indexedDB的庫,可以參考一下:duan602728596/IndexedDB

原文:HTML5本地存儲--IndexedDB - 筆記 - 前端網(QDFuns)

推薦閱讀:

安卓平台的瀏覽器 touchend 事件觸發失效?
一旦打開就忍不住想狂點滑鼠,9 個有趣的 HTML 5 交互網站
SegmentFault 技術周刊 Vol.20 - 用 Canvas 畫個星空

TAG:HTML5 |