データベース操作
次のサンプルは、入力した名前でデータベースを生成する。データベースの生成が終わったら、すぐに切断し、生成したデータベースを削除する。
<script type="text/javascript"> $(function(){ // IDBFactoryオブジェクトを取得 var idb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB; if( !idb ) { alert('indexedDBをサポートしていない'); return; } $('#exec').click(function(){ // データベース名を得る var input_el = document.querySelector("#name"); var valid = input_el.checkValidity(); if(valid === false){ alert(input_el.validationMessage); return; } var dbname = input_el.value; var result = $('#result'); // DB接続開始(IDBOpenDBRequestオブジェクト) // open()メソッド // * 第一引数:DB名(文字数) // * 第二引数:バージョン番号(整数) var openreq = idb.open(dbname,1); // DB接続に失敗したときの処理 openreq.onerror = function(event){ var error = event.taget.error; $('<p>DB接続に失敗しました ' + error.name + ' ' + error.message + '</p>').appendTo(result); } // DB生成に成功したときの処理 // バージョン番号が上がったときも含む openreq.onupgradeneeded = function(event){ // IDBDatabaseオブジェクトを取得 var db = event.target.result; // DB名とバージョン番号を出力 $('<p>DB生成に成功しました。 ' + db.name + ' ver:' + db.version + '</p>').appendTo(result); } // DB接続に成功したときの処理 openreq.onsuccess = function(event){ // IDBDatabaseオブジェクトを取得 var db = event.target.result; $('<p>DB接続に成功しました。 ' + db.name + ' ver:' + db.version + '</p>').appendTo(result); // DBの切断 db.close(); $('<p>DBを切断しました。</p>').appendTo(result); // DB削除開始 var deletereq = idb.deleteDatabase(dbname); // DB削除に失敗したときの処理 deletereq.onerror = function(){ $('<p>DB削除に失敗しました。</p>').appendTo(result); } // DB削除に成功したときの処理 deletereq.onsuccess = function(event){ $('<p>DB削除に成功しました。</p>').appendTo(result); } } }); }); </script> </HEAD> <BODY> <p>Indexd Databaseの作成</p> <form action="#" method="post" id="register"> <label for="name">データベース名:</label> <input type="text" name="name" id="name" required> <input id="exec" type="button" value="実行"> </form> <div id="result"></div> </BODY>
Imdex Database APIでは最初に、window.indexDBプロパティからIDBFactoryオブジェクト(変数idb)を得る。このオブジェクトはデータベース全体を表していて、次のメソッドが利用できる。
メソッド | 説明 |
---|---|
open(name,version) | 引数nameの名前を持ったデータベースに接続する。該当するデータベースが存在しなければ、新規に生成する。バージョン番号は引数versionに整数で指定することができる。ただし、0を指定することはできない。指定がなければ1として処理される。 |
deleteDatabase(name) | 引数nameの名前を持ったデータベースを削除する。 |
①IDBFactoryオブジェクト(変数idb)のopen()メソッドの第二引数にはバージョン番号を1以上の整数で指定できる。しかし、同じ名前のデータベースが存在し、そのバージョン番号より低い番号をopen()メソッドに指定すると、データベースの接続に失敗する。
②open()メソッドを実行すると、IDBOpenDBRequestオブジェクト(変数openreq)を返す。このオブジェクトには次の3つの状態イベントをプロパティに指定できる
- onerrorプロパティには接続に失敗したときに呼び出されるコールバック関数
- onupgradeneededプロパティにはデータベースが新たに生成されたとき、または、データベースのバージョン番号が上がったときに呼び出されるコールバック関数
- onsuccessプロパティには接続に成功したときに呼び出されるコールバック関数
③open()メソッドによって接続しようとしたデータベース名とバージョン番号が一致するデータベースが存在しない場合は、まずonupgradeneededプロパティのコールバック関数が呼び出され、その直後に、onsuccessプロパティのコールバック関数が呼び出される。該当するデータベースがすでに存在していれば、onupgradeneededプロパティのコールバック関数は呼び出されず、onsuccessプロパティのコールバック関数のみが呼び出される。したがって、データベースの初期化(オブジェクトストアの生成など)処理は、onupgradeneededプロパティのコールバック関数に入れる。
④onupgradeneededとonsuccessプロパティにセットされたコールバック関数の引数に引き渡されるイベントオブジェクトのtarget.resultプロパティからIDBDatabaseオブジェクト(変数db)を取得する。このオブジェクトが接続したデータベースを表している。IDBDatabaseオブジェクト(変数db)では、次のプロパティとメソッドが利用できる。
プロパティとメソッド | 説明 |
---|---|
name | データベース名を返す。 |
version | データベースのバージョン番号を返す。 |
close() | データベース接続を切断する。これは非同期ではない。 |
objectStoreNames | オブジェクトストアのリストを返す。 |
createObjectStore(name,params) | 引数nameに指定した名前のオブジェクトストアを生成する。引数paramsにはパラメータをオブジェクトで指定することができる。キーの名前やautoIncrementの有無を扱う。 |
deleteObjectStore(name) | 引数nameに指定した名前のオブジェクトストアを削除する。 |
transaction(storeNames,mode) | 引数storeNamesに指定した名前のリストにあるオブジェクトストアに対して、トランザクション処理の準備を行う。 |