1. 程式人生 > >web API簡介(四):客戶端儲存之IndexedDB API

web API簡介(四):客戶端儲存之IndexedDB API

特性 通知 name com 模式 upgrade doesn 需要 code

概述

前篇:web API簡介(三):客戶端儲存之Web Storage API

客戶端儲存從某一方面來說和動態網站差不多。動態網站是用服務端來儲存數據,而客戶端儲存是用客戶端來儲存數據。

IndexedDB API就是現代HTML5客戶端儲存的方法之二。

IndexedDB介紹

IndexedDB是專門為大量結構化數據設計的。

IndexedDB有這些特性

(1)IndexedDB數據庫儲存的是鍵值對。

(2)IndexedDB是基於事務型數據庫模型的。

(3)IndexedDB API是異步型的。

(4)IndexedDB使用很多請求(requests)和響應。

(5)IndexedDB使用DOM通知你,當結果被返回的時候。

(6)IndexedDB數據庫是對象型的數據庫。

(7)IndexedDB不使用SQL。

(8)IndexedDB遵循同源政策。


IndexedDB有這些限制

(1)不支持排序。

(2)不支持同步操作。你必須自己寫同步操作代碼。

(3)不支持全文搜索,不支持類似SQL中的LIKE功能。

儲存限制

indexedDB的Storage屬性有2種:永久型和臨時型。

永久型數據沒有任何限制,永久儲存,只有當用戶刪除它的時候才會被刪除。

臨時型數據有一個全局限制和同源限制。全局限制是指臨時性數據的總量是50%的磁盤總量。當超出的時候,瀏覽器會自動刪除最久遠被用到的數據,直到可以儲存目前需要儲存的數據。同源限制是指同源下的臨時型數據總量有一個限制,這個限制是全局限制的20%,但不低於10M,且不超過2G。當超出同源限制的時候,瀏覽器會拋出一個錯誤。

IndexedDB的使用模式

和MongoDB的使用差不多,具體如下:

(1)打開一個數據庫。

(2)在數據庫中建立一個object store。

(3)開始一項事務,並且用請求來操作數據庫。

(4)通過監聽DOM事件等待事務完成。

(5)利用返回的數據(request object)做一些操作。

使用IndexedDB

檢驗是否支持IndexedDB

if (!window.indexedDB) {
    window.alert("Your browser doesn't support a stable version of IndexedDB. Such and such feature will not be available.");
}

打開IndexedDB數據庫

var request = window.indexedDB.open("MyTestDatabase", 3);

其中3是版本號。版本號不能用小數,否則會被四舍五入成整數。

更新IndexedDB數據庫版本

在request發出後,onerror和onsuccess響應前,如果打開的IndexedDB數據庫版本比已經存在的數據庫版本低,那麽就會出現onerror,如果如果打開的IndexedDB數據庫版本比已經存在的數據庫版本高,就會響應onupgradeneeded事件。

var request = indexedDB.open(dbName, 2);

//存在的數據庫版本比2低的時候響應如下事件。
request.onupgradeneeded = function(event) {

  //數據庫在event.target的resule屬性裏面
  var db = event.target.result;

  //建立object store,並設立鍵值
  var objectStore = db.createObjectStore("customers", { keyPath: "ssn" });

  //設定object store的索引name,並設定為可以重復
  objectStore.createIndex("name", "name", { unique: false });

  //設定object store的索引email,並設定為不可以重復
  objectStore.createIndex("email", "email", { unique: true });
  };

也可以利用autoIncrement設定一個自增長的鍵值。

//建立object store,並設立自增長的鍵值,儲存在key字段中
var objectStore = db.createObjectStore("customers", { autoIncrement: true });

等待並返回IndexedDB數據庫

var db;
request.onerror = function(event) {
  alert("Why didn't you allow my web app to use IndexedDB?!");
};
request.onsuccess = function(event) {
  db = event.target.result;
};

占坑

占坑

web API簡介(四):客戶端儲存之IndexedDB API