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/