トップページ >  HTML5 >  Indexed Database
初版2011/08/20: 最終更新日2011/08/20
Indexed Database
目次
Indexed Databaseとは
Indexed Databaseの使い方
Indexed Databaseとは

Indexed Databaseは、クライアントサイドで NoSQL ベースのデータベースを利用するためのインターフェースAPIです。
Web Storage」の手軽さとデータベースの高速性と機能性を実現するAPIです。
Web Storage」同様にオリジン(Origin)ごとに固有の領域を持ち、複数のデータベースを保持することができます。
Web SQL Database」にあるあるSQL方言の懸念を持ちません。
但し、最後発のAPIのため、仕様自体が固まり切れていないホヤホヤのAPIです。

各ブラウザの対応

Indexed Databaseは、2011年8月現在以下の正式に対応を発表しているブラウザがありません。

現時点では indexedDB(IDBFactory)にベンダープリフィックスを付けてアクセスします。
Chrome であれば、webkitIndexedDB。
Firefoxであれば moz_indexedDB、または mozIndexedDB。

※この仕様はまだ策定途中です。最新の仕様を確認しながらお使いください。

Indexed Databaseの使い方

Indexed Databaseの使い方は、「オブジェクトストア」という単位でデータ種別を分離します。
オブジェクトストアは、任意のJavascriptオブジェクトを値にとるkey-value型のNoSQL データベースです。
データベースへの接続や作成は、SQLデータベースに似ています。
値への取得・追加は、ストレージに似ています。

データベースの接続

まずデータベースに接続し、データベースオブジェクトを取得します。
前述の通り、現時点では indexedDB(IDBFactory)にベンダープリフィックスを付けてアクセスします。

リスト1. Indexed Databaseに接続

//Chrome、Firefoxのベンダープリフィックス対応
var indexedDB = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB || window.moz_indexedDB;

// データベース接続
var con = indexedDB.open("myDB");
第1引数 : データベース名
データベースに付ける名前

データベース接続の成功と失敗は「success」と「error」イベントとして定義できます。

リスト2. 接続の成功と失敗イベント

// 成功時のイベント
con.onsuccess = fucntion(evt){
	var db = evt.result;
}

// 失敗時のイベント
con.onerror = function(error){
	alert(error.message + "(" + error.code + ")");
}

オブジェクトストアの作成

オブジェクトストアは、データを格納容器です。
リレーショナルデータベースのテーブルに相当します。
オブジェクトストア、及びインデックスの作成と削除はデータベースのバージョン変更時にしか行うことができません。
作成時には注意が必要です。

リスト3. オブジェクトストアの作成

con.onsuccess = fucntion(evt){
	var db = evt.result;

	//オブジェクトストア作成(in-line key として id を指定)
	var tbl = db.createObjectStore("myTable", "id", true);

	//Chromeの場合
	//var tbl = db.createObjectStore("myTable", {"keyPath": "id"}, false);

	//インデックスを作成(省略可)
	tbl.createIndex("name", false);
}

(インデックスデータベースオブジェクト).createObjectStore(オブジェクトストア名, in-line-key, autoIncrement)
オブジェクトストアを作成します。
第1引数には、オブジェクトストアの名前を指定します。
第2引数には、データ内のプロパティをキーとします。データ追加時には、該当プロパティに値が存在する必要があります。
第3引数は、キーの自動インクリメントの有無です。
(インデックスデータベースオブジェクト).createIndex(インデックス名, autoIncrement)
インデックスを作成します。
第1引数には、インデックスキーとなるプロパティ名を指定します。
第2引数は、キーの自動インクリメントの有無です。

トランザクション

データの操作を行うために、トランザクションを開始します。

リスト3. オブジェクトストアの作成

//Chromeのベンダープリフィックス対応
var IDBTransaction = window.IDBTransaction || window.webkitIDBTransaction;

//トランザクションの開始とオブジェクトストアの取得
var store = db.transaction([], IDBTransaction.READ_WRITE).objectStore("myTable");
IDBTransactionオブジェクト
静的な非同期トランザクションオブジェクトです。
objectStore(オブジェクトストア)
開始されたトランザクションに対し、オブジェクトストアを取得するメソッドです。

データの操作

データの追加、削除はオブジェクトストア単位に行います。

リスト4. データの操作

//格納するデータ
var data = 	{
	id			: 10,
	name		: "データ名",
	description	: "データの詳細",
	creat_date	: "2011-8-20",
	update_date	: "2011-8-20",
	author		: "..."
			}
/*
	上記はデータ例です。
	オブジェクト型で定義します。
*/

//データの追加
store.add(data);

//データの削除
store.delete("10");
(オブジェクトストア).add(データオブジェクト)
オブジェクトストアに、データ(オブジェクト)を追加するメソッドです。
(オブジェクトストア).delete(in-line-key)
オブジェクトストアに、データ(オブジェクト)を削除するメソッドです。
in-line-keyは、createObjectStoreメソッドで指定したキーの値です。

データの取得

データの取得はオブジェクトストア単位に行います。

リスト5. データの取得


//データの取得
store.get("10");
(オブジェクトストア).get(in-line-key)
オブジェクトストアに、データ(オブジェクト)を取得するメソッドです。
in-line-keyは、createObjectStoreメソッドで指定したキーの値です。

カーソル移動

カーソルとは、オブジェクトストアに格納されているデータ群のうち、現在位置になります。

リスト6. カーソル移動

//in-line keyを用いたカーソル移動
store.get("10").onsuccess = function(evt) {
	/*
		getメソッドで検索し、成功した場合のイベントを定義します。
*/ var cursor = evt.target.result; alert("id=10は、" + cursor.name ); }; //カーソルの連続移動 store.openCursor().onsuccess = function(evt) { var cursor = evt.target.result; if (cursor) { alert("ID: " + cursor.key + ", Name: " + cursor.value.name + ", description: " + cursor.value.description); cursor.continue(); } }

データの変更

データの変更は、カーソル単位で行います。

//in-line keyを用いたデータ変更
store.get("10").onsuccess = function(evt) {
	var cursor = evt.target.result;
	if (cursor) {
		var data = cursor.value;
		data.name = "更新データ";
		data.description = "更新されたデータ";
		data.update_date = "2011-08-20";

		//データ変更反映
		cursor.update(data);
		cursor.continue();
	}
};