IndexedDB是在浏覽器中儲存結構化資料的一種資料庫,為了替換WebSQL(标準已廢棄,但被廣泛支援)而出現。IndexedDB使用NoSQL的形式來操作資料庫,儲存和讀取是JavaScript對象,同時還支援查詢及搜尋。
下面由5個方面講述:
1. 資料庫初始化
2. 對象存儲空間(ObjectStore)
3. 事務
4. 遊标查詢
5. 索引
資料庫初始化
IndexedDB儲存的是對象,而不是使用表儲存資料。打開資料庫使用indexDB.open方法,這方法有兩個參數,第一個是資料庫名稱,第二個是資料版本号。
PS:IndexedDB的操作完全是異步進行的,每一次IndexedDB操作,都需要注冊onerror或onsuccess事件處理程式。
<a></a>
PS:這裡要注意的是,資料庫版本隻會有最新一個,不會同時存在兩個版本的同名資料庫。
對象存儲空間(ObjectStore)
對象存儲空間(ObjectStore)可以想象成關系資料庫的表,在初始化DB觸發onupgradeneeded時,建立ObjectStore。使用createObjectStore方法,第一個參數是對象名,第二個參數是對象屬性,一般是設定keyPath(作為鍵使用)。
效果如下:
事務
所有讀取或修改資料的操作,都要通過事務來完成。建立事務使用transaction方法,第一個參數是需要通路的ObjectStore,第二個參數是通路模式(readwrite、readonly,預設是隻讀)。
添加資料
擷取資料
修改資料
删除資料
清空資料
遊标查詢
使用事務可以直接通過鍵檢索單個對象,而需要檢索多個對象時候就需要使用遊标。遊标是指向結果集的指針,不提前收集結果。遊标指針會先指向結果中的第一項,在接到查找下一項指令時,才會指向下一項。
這裡有幾點要注意:
1. 如果需要修改或删除資料,就需要打開成讀寫模式。
2. cursor的非空校驗是必要的。
3. 修改或删除的操作也是有onsuccess和onerror的,隻是在示例中沒有寫出來。
4. 調用continue才會移動到下一項
另外可以設定遊标的鍵範圍和遊标的方向,即打開openCursor方法時可以傳這兩個參數(openCursor(鍵範圍,方向)),第一個參數是object類型,第二個參數是字元串類型。
遊标鍵範圍
鍵範圍由IDBKeyRange的執行個體表示。
遊标方向
next : 從第一項到最後一項(預設)
prev : 從最後一項到第一項
索引
當需要使用其他屬性(非主鍵)擷取資料時,就要預先建立索引,然後使用索引擷取資料。
建立索引(在資料庫初始化onupgradeneeded事件時)
第一個參數是索引名字,第二個參數是索引的屬性的名字,第三個是一個options對象。一般是指定unique,設定索引是否唯一。
索引擷取資料
PS:索引用法跟普通取值和遊标取值一樣
對象存儲所有索引
浏覽器支援情況
總結
在使用IndexedDB時候,有人可能會拿WebSQL來比較,然後發現IndexedDB不能做表連接配接(因為根本沒有這東西),也就是要查出一個資料,可能得分幾次進行。
例如學生、課程、分數三個表資料,想查出某個學生的課程成績,就得三個表連接配接,WebSQL分分鐘信手拈來。但是如果你用IndexedDB,就得分三次查找,先拿出那個學生,再拿出課程,然後再拿成績。
這樣看起來IndexedDB很蠢,這樣就進入誤區了,你為什麼要這麼去存你要展示的資料,NoSql就用NoSql東西,就直接以一個對象存學生成績,一次查找就行了。
本文為原創文章,轉載請保留原出處,友善溯源,如有錯誤地方,謝謝指正。
本文轉自 海角在眼前 部落格園部落格,原文連結: http://www.cnblogs.com/lovesong/p/5055384.html ,如需轉載請自行聯系原作者