Indexed Database APIを使いやすくするためのライブラリ KageDB その4 - カーソル

KageDB の紹介です。

今回は、次のバージョン(0.0.2)に入れる予定の機能ということでカーソルについて書きます。


IndexedDBのカーソルを使った検索には、keyRangeとdirectionというものが関係してきます。keyRangeは検索するキーの範囲。directionは検索するときの方向と重複を除去するかどうかを示します。


IndexedDBのAPIとしては、IDBKeyRangeというクラスのメソッドを使ってキーの範囲をあらわしますが、ちょっと使いづらい(わかりにくい)APIです。

上限下限の境界で迷うんですよね。MDNの表がよくまとまっています。


それから、directionは定数が用意されていて、IDBCursor.NEXTとかIDBCursor.PREVとかが使えます。でもeditor's draftだと、定数ではなく"next"とか"prev"とかいった文字列を使うことになっています。個人的には、javascriptでは文字列のほうがすっきり書けて好きです。


KageDBでは、keyRangeは { ge: 10 } とか{ gt: 10, le: 20 } のようにオブジェクトで表現して、directionはeditor's draftを先取りして"next"とか"prev"とか文字列で示せるようにします。そして、どちらも省略可能。こんな感じで書けます。

myDB.tx(["person"], function (tx, person) {
    person.openCursor({eq: 10,}, function (cursor) {
        ...
    });
});
myDB.tx(["person"], function (tx, person) {
    person.openCursor({ge: 10, le: 20}, function (cursor) {
        ...
    });
});
myDB.tx(["person"], function (tx, person) {
    person.openCursor("prev", function (cursor) {
        ...
    });
});
myDB.tx(["person"], function (tx, person) {
    person.openCursor({gt: 10, lt: 20}, "prev", function (cursor) {
        ...
    });
});


もちろん、indexを指定したカーソル検索もできます。

myDB.tx(["person"], function (tx, person) {
    person.index("name").openCursor({ge: "h"}, "nextunique", function (cursor) {
        ...
    });
});