日本でやってる人は少ないのかな…
iOSも8からindexeddbに対応したらしいので、もうindexeddbで統一しちゃってもいいのかもしれないですね。不安定と聞いてますが…
使い方は難しくはないのでちょっとご紹介します。ydn-db
定義
RDBで言えば、store.nameはテーブル名(mytable)、store.keypathはキー列名(userid)、一つ目の引数はデータベース名(mydb)という感じです。
var schema = { stores: { name:"mytable", keyPath:"userid" } };
var jdb = new ydn.db.Storage("mydb", schema);
insert or update
キー列で上書きされちゃいます。
jdb.put("mydb", { userid:"1", username:"suzuki" } );
一気にやりたい場合は配列で押し込む。
jdb.put("mydb", [
{ userid:"2", username:"sato" },
{ userid:"3", username:"tanaka" },
] );
putはdeferredを返しませんが、doneとfailはチェインできます。
jdb.put("mydb", [
{ userid:"10", username:"a.suzuki" },
{ userid:"11", username:"i.suzuki" },
] ).done( function() {
console.log("正常終了");
} ).fail( function() {
console.log("エラー");
});
値の取得
getですが、こちらはdeferredを返します。
var task = jdb.get("mydb", "1");
task.then( function(data) {
console.log(data.username); → suzuki
});
データに型がありますのでご注意を。failにもなりませんのでハマりやすいかも。
var task = jdb.get("mydb", 1);
task.then( function(data) {
console.log(data.username); → undefined
});
変数で指定する場合なんかはきちんと変換してやりましょう。
var i = 1;
var task = jdb.get("mydb", i + "");
task.then( function(data) {
console.log(data.username); → suzuki
});
同時実行の場合はdeferredが活躍します。
var task1 = jdb.get("mydb", "1").done( function(d) { console.log(d) } );
var task2 = jdb.get("mydb", "2").done( function(d) { console.log(d) } );
$.when.apply(task1, task2).then( function() {
console.log("done.");
} );
全行の取得
jdb.values("mydb").then( function(items){
for(i in items) {
console.log(i.userid + ': ' + i.username);
}
} );
行数の取得
jdb.from("mydb").count().then( function(c){ console.log(c) } );
sqlに近いものも使えて、全文検索までできるようですが、そこまでは使い込んでいません。
クライアントサイドだけでそこまでやろうとはなかなか思わないので…