HTML5本地存儲——IndexedDB
IndexedDB 是一種低級API,用於客戶端存儲大量結構化數據(包括, 文件/ blobs)。該API使用索引來實現對該數據的高性能搜索。
對於只存儲某些欄位的需求來說,可以使用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 |