js Indexed database api

Indexed Database APIは、値とオブジェクトをローカルマシンに保存し、オブジェクトに対する高速なインデックス処理と検索を可能にするローカルデータベース。
Web Storageとは異なり、データベースとして扱うことができる。

本家

オブジェクトストア
リレーショナルデータベースの「テーブル」に相当。
オブジェクト:キー/バリュー型で格納
リレーショナルデータベースの「レコード」に相当。
  • インデックスを使用することでオブジェクトストア内のオブジェクトを効果的に検索。
  • 基本的にキーはオブジェクトを指定して取得する際に使用。
  • インデックスは特定範囲のオブジェクトをまとめて取得する際に利用。

indexedDBオブジェクトを使用してデータベースを利用。
indexedDBオブジェクトは、IDBEnvironmentオブジェクトのプロパティーに定義されている。

IDBEmviromentのプロパティ
indexedDB: データベースを生成・・削除するためのIDBFactory型のオブジェクト
IDBFactoryのメソッド
open(): データベースを開く。
返り値としてIDBOpenDBRequestオブジェクトを返す。
deleteDatebase(): データベースを削除。
返り値としてIDBOpenDBRequestオブジェクトを返す。
cmp(): 2つのキーを比較
IDBRequestのプロパティ
result: データベースへの操作の実行結果
error: エラーが発生したときのDOMErrorオブジェクト
source: 本処理のもとになったオブジェクト
(IDBObjectStore型, IDBIndex型, IDBCursor型)
transaction: 本処理のトランザクション(IDBTransaction型)
readyState: pendingかdoneの状態
IDBRequestのイベントハンドラ
onsuccess: 処理が発生し、エラーなく完了した場合に呼ばれる
onerror: エラーが発生した場合に呼ばれる
IDBOpenDBRequestのイベントハンドラ
onblocked: 処理をブロックした場合に呼ばれる
onupgradeneeded: アップグレード処理が必要になった場合に呼ばれる
;(function() {
  // archivesというDBを開く
  // DBが存在しない場合は新規に作成される
  // 2番目の引数はバージョン。DBの構造を変える場合などは変更し、
  // 次の request.onupgradeneededが実行されるようにする。
  var request = indexedDB.open("archives", 1);

  // onupgradeneeded: アップグレード処理が必要になったら呼ばれるイベントハンドラ
  // DBの新規作成、またはバージョン変更時に1回だけ実行され、DBの構造自体の変更が行える
  request.onupgradeneeded = function() {
    // The database did not previously exist, so create object stores and indexes.
    // result: データベースへの捜査の実行結果
    var db = request.result;
    // オブジェクトストア(≒テーブル)の作成。 
    // 格納するオブジェクトのkeyPath(≒プライマリキー)を設定
    var store = db.createObjectStore("books", {keyPath: "isbn"});
    // インデックスrの作成
    var titleIndex = store.createIndex("by_title", "title", {unique: true});
    var authorIndex = store.createIndex("by_author", "author");

    // データ挿入
    store.put({title: "タイトル1", author: "著者1", isbn: 11111});
    store.put({title: "タイトル2", author: "著者2", isbn: 22222});
    store.put({title: "タイトル3", author: "著者3", isbn: 33333});
  };

  // DBオープン失敗時の処理
  request.onerror = function() {
  	console.log("error");
  }
}());


;(function() {
  // archivesというDBを開く
  var request = indexedDB.open("archives", 1);

  // DBオープン成功時の処理
  request.onsuccess = function() {
  	var db = request.result;
  	// オブジェクトストア: booksを読み書き権限付きで使用することを宣言
  	var tx = db.transaction("books", "readwrite");
  	// オブジェクトストアの取り出し
  	var store = tx.objectStore("books");

    // データ挿入
    store.put({title: "タイトル4", author: "著者4", isbn: 44444});
    store.put({title: "タイトル5", author: "著者5", isbn: 55555});
    store.put({title: "タイトル6", author: "著者6", isbn: 66666});

    // すべてのデータがデータベースに追加されたときに行う処理
  	tx.oncomplete = function() {
  	  console.log("All done!");
  	};
  }
}());