Indexed Database APIを使いやすくするためのライブラリ KageDB その2 - バルク更新

今回も、KageDB の紹介。


今回はバルク更新です。
IDBObjectStoreのadd/put/deleteに対応して、bulkAdd/bulkPut/bulkDeleteというメソッドを追加しています。名前のとおり、複数件をまとめて更新できます。


KageDBのbulkAddの使用例は次のようになります。

myDB.tx(["person"], function (tx, person) {
    var values = [
        { name: "SMITH", age: 31 },
        { name: "KING", age: 25 },
        { name: "JHON", age: 40 }];
    person.bulkAdd(values, function (keys) {
        console.log("keys = " + keys); // keys = 1,2,3         
        console.log("done bulkAdd");
    });
});


オリジナルのAPIだけでやるとだいたい次のような感じになります(エラー処理など省いています)。

var store = tx.objectStore("person");
var values = [
    { name: "SMITH", age: 31 },
    { name: "KING", age: 25 },
    { name: "JHON", age: 40 }];
var len = values.length;
var pending = len;
var keys = new Array(len);
for (var i = 0; i < len && pending > 0; i++) {
    (function (i) {
        var req = store.add(values[i]);
        req.onsuccess = function (event) {
            var key = event.target.result;
            keys[i] = key;
            pending--;
            if (pending === 0) {
                console.log("keys = " + keys); // keys = 1,2,3         
                console.log("done bulkAdd");
            }
        };
    }(i));
}


というわけで、オリジナルなAPIだと煩雑になってしまうところを簡素化しています。

やっぱり、非同期処理は待ち合わせがめんどいですよねー。


実は、jsfiddleで動くサンプルを目指したんですけど、IndexedDBとjsfiddleの相性がよくないみたい。IEだと固まるし、FireFoxだとmozIndexedDBのインスタンスがとれない。Chromeだと動きました。一応、リンク張っておきます。http://jsfiddle.net/nakamura_to/Ybvsu/