レコードの操作
レコードの追加や削除は、IDBDatabaseオブジェクト(変数db)のtransaction()メソッドを通して非同期に実行する。オブジェクトストアの生成は、IDBOpenDBRequestオブジェクト(変数openreq)のonupgradeneededプロパティにセットしたコールバック関数で処理してきたが、レコードの操作はonsuccessプロパティにセットしたコールバック関数で処理する。
次のサンプルは、データベースとオブジェクトストアを生成し、その後レコードを1つ追加する。
<script type="text/javascript">
$(function(){
var result = $('#result');
// IDBFactoryオブジェクトを取得
var idb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;
if( !idb ) {
$('<p>indexedDBをサポートしていない</p>').appendTo(result);
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 deletereq = idb.deleteDatabase(dbname);
// 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;
// オブジェクトストア生成(IDBObjectStoreオブジェクト)
var params = { keyPath: "id",autoIncrement:true };
var store = db.createObjectStore("mystore",params);
// インデックス生成
var index_params = { unique:false };
store.createIndex("name_index","name",index_params);
}
// DB接続に成功したときの処理
openreq.onsuccess = function(event){
// IDBDatabaseオブジェクトを取得
var db = event.target.result;
// IDBTransactionオブジェクトを取得
var tansaction = db.transaction(["mystore"],"readwrite");
// IDBObjectStoreオブジェクトを取得
var store = tansaction.objectStore("mystore");
// レコード追加開始(IDBRequestオブジェクト)
var putreq = store.put({name:"商品1",price:500});
// レコード追加が成功したときの処理
putreq.onsuccess = function(){
$('<p>レコードの追加に成功しました。</p>').appendTo(result);
db.close();
}
}
});
});
</script>
</HEAD>
<BODY>
<p>レコードの操作</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>
IDBOpenDBRequestオブジェクト(変数openreq)のonsuccessプロパティにセットしたコールバック関数で、レコードの操作を行う。
①まず、IDBDatabaseオブジェクト(変数db)のtransaction()メソッドを使って、IDBTransactionオブジェクト(変数transaction)を取得する。
このメソッドの第一引数には、レコードを操作するオブジェクトストア名の配列を指定する。第二引数にはレコードのアクセスモードを文字列で指定する。読み取るだけならば”readonly”を、書き込みも必要ならば”readwrite”を指定する。
②次に、IDBTransactionオブジェクト(変数transaction)のobjectStore()メソッドから、オブジェクトストアを表すIDBObjectStoreオブジェクト(変数store)を取得する。このオブジェクトが操作するオブジェクトストアを表す。
③最後に、IDBObjectStore(変数store)のput()メソッドを使って、レコードを追加する。このメソッドはIDBRequestオブジェクト(変数putreq)を返す。put()メソッド処理は非同期のため、レコード追加の成功判定をする場合には、onsuccessプロパティにコールバック関数を指定する。
④このサンプルでは、オブジェクトストアを作る際に、パラメータkeyPathに”id”を、さらに、autoIncrementにtrueを指定しているため、レコードを追加する際にidに相当する値は自動採番されるため、主キーとなるidの値は必要としない。もしautoIncrementをfalseにセットしたのであれば、その値はレコード登録の都度、指定しなければならない。
⑤IDBObjectStoreオブジェクトには、put()メソッドの他にさまざまなメソッドが用意されている。
| メソッド | 説明 |
|---|---|
| put(value) | 引数valueに指定したオブジェクトデータを追加する。ただし、重複が許されないカラムが存在し、既存のデータにそのカラムが重複した場合は、そのデータを上書きする。 |
| add(value) | 引数valueに指定したオブジェクトデータを追加する。 |
| delete(key) | 引数valueに指定した値に一致する主キーを持つレコードを削除する。 |
| get(key) | 引数keyに指定した値に一致する主キーを持つレコードを検索する。 |
| clear() | オブジェクトストアの全レコードを削除する。 |
これらのメソッドの処理はすべて非同期である。これらのメソッドを実行するとIDBRequestオブジェクトを返す。このオブジェクトのonsuccessプロパティに、処理が成功したときのコールバック関数をセットして後続の処理を行う。
次のサンプルは、オブジェクトストアに100個のレコードを追加する。
<script type="text/javascript">
$(function(){
var result = $('#result');
// IDBFactoryオブジェクトを取得
var idb = window.indexedDB || window.webkitIndexedDB || window.mozIndexedDB;
if( !idb ) {
$('<p>indexedDBをサポートしていない</p>').appendTo(result);
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 deletereq = idb.deleteDatabase(dbname);
// 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;
// オブジェクトストア生成(IDBObjectStoreオブジェクト)
var params = { keyPath: "id",autoIncrement:true };
var store = db.createObjectStore("mystore",params);
// インデックス生成
var index_params = { unique:false };
store.createIndex("name_index","name",index_params);
}
// DB接続に成功したときの処理
openreq.onsuccess = function(event){
// IDBDatabaseオブジェクトを取得
var db = event.target.result;
// IDBTransactionオブジェクトを取得
var tansaction = db.transaction(["mystore"],"readwrite");
// IDBObjectStoreオブジェクトを取得
var store = tansaction.objectStore("mystore");
// 100レコード追加
var num = 0;
function putRecords(){
num++;
if(num <= 100){
var putreq = store.put({name:"商品" + num,price:num * 100});
putreq.onsuccess = function(){
putRecords();
}
}else{
$('<p>レコードの追加に成功しました。</p>').appendTo(result);
db.close();
}
}
putRecords();
}
});
});
</script>
</HEAD>
<BODY>
<p>レコードの操作</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>