天天看點

Web資料持久化存儲IndexedDB(不常用)

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(作為鍵使用)。

效果如下:

Web資料持久化存儲IndexedDB(不常用)

事務

所有讀取或修改資料的操作,都要通過事務來完成。建立事務使用transaction方法,第一個參數是需要通路的ObjectStore,第二個參數是通路模式(readwrite、readonly,預設是隻讀)。

添加資料

擷取資料

修改資料

删除資料

清空資料

遊标查詢

使用事務可以直接通過鍵檢索單個對象,而需要檢索多個對象時候就需要使用遊标。遊标是指向結果集的指針,不提前收集結果。遊标指針會先指向結果中的第一項,在接到查找下一項指令時,才會指向下一項。

這裡有幾點要注意:

1. 如果需要修改或删除資料,就需要打開成讀寫模式。

2. cursor的非空校驗是必要的。

3. 修改或删除的操作也是有onsuccess和onerror的,隻是在示例中沒有寫出來。

4. 調用continue才會移動到下一項

另外可以設定遊标的鍵範圍和遊标的方向,即打開openCursor方法時可以傳這兩個參數(openCursor(鍵範圍,方向)),第一個參數是object類型,第二個參數是字元串類型。

遊标鍵範圍

鍵範圍由IDBKeyRange的執行個體表示。

遊标方向

next : 從第一項到最後一項(預設)

prev : 從最後一項到第一項

索引

當需要使用其他屬性(非主鍵)擷取資料時,就要預先建立索引,然後使用索引擷取資料。

建立索引(在資料庫初始化onupgradeneeded事件時)

第一個參數是索引名字,第二個參數是索引的屬性的名字,第三個是一個options對象。一般是指定unique,設定索引是否唯一。

索引擷取資料

PS:索引用法跟普通取值和遊标取值一樣

對象存儲所有索引

浏覽器支援情況

Web資料持久化存儲IndexedDB(不常用)

總結

在使用IndexedDB時候,有人可能會拿WebSQL來比較,然後發現IndexedDB不能做表連接配接(因為根本沒有這東西),也就是要查出一個資料,可能得分幾次進行。

例如學生、課程、分數三個表資料,想查出某個學生的課程成績,就得三個表連接配接,WebSQL分分鐘信手拈來。但是如果你用IndexedDB,就得分三次查找,先拿出那個學生,再拿出課程,然後再拿成績。

這樣看起來IndexedDB很蠢,這樣就進入誤區了,你為什麼要這麼去存你要展示的資料,NoSql就用NoSql東西,就直接以一個對象存學生成績,一次查找就行了。

本文為原創文章,轉載請保留原出處,友善溯源,如有錯誤地方,謝謝指正。

本文轉自 海角在眼前 部落格園部落格,原文連結: http://www.cnblogs.com/lovesong/p/5055384.html  ,如需轉載請自行聯系原作者