shumpei / jdb.js

jdb.js is a framework that helps coding with Indexed Database API (IDB). As you know, 'J' is the next character of 'I' in alphabetical order, so 'JDB' means the 'Better IDB API':-)
28 stars 1 forks source link

add JDBDatabase.getObjectStore() #6

Closed pikotea closed 12 years ago

pikotea commented 12 years ago

JDBObjectStore()のoptionsにdatabaseを指定してnewするのは好みじゃないので、JDBDatabaseにgetObjectStore()を追加してみました。

shumpei commented 12 years ago

なるほど、了解です。ただ、「get」だと「あらかじめ存在するものを取得する」というニュアンスが強いように感じるんで、「createObjectStore()」とかにしようかなあ。

そうなると、getObjectStore(name)とかremoveObjectStore(name)とかも欲しくなりますね。

他、APIで気になるところとかあります?

pikotea commented 12 years ago

そうか、openする前にcallしてるんですよね。

そうなると、JDBObjectStoreをopen前にオブジェクトをゲットできるのにも違和感が。 openする前には、定義だけ登録していて、DB開いてからgetObjectStore(name)する形でどうです?

var EmployeeDB = new JDBDatabase('EmployeeDB3', 1); EmployeeDB.add([ name: 'EmployeeStore', key: { path: 'id', autoIncrement: true }, indexes: { ageIdx: { path: 'age' } } ]);

EmployeeDB.open();

/* 何か */

var EmployeeStore = EmployeeDB.getObjectStore(name);

とかとか

pikotea commented 12 years ago

割と斜め読みなので、もうちょっと中身を見ますね~。 バグフィクス以外は、決定してからpull requestしたほうが良さそうだ。

ObjectStoreの削除がないので白石さんが言うようにremoveObjectStore(name)は欲しいですが、 どちらにせよopen時しか実行できないので↑の方法で良いかなーと。定義が無ければremoveな感じで。

あとは定義を変更してそのままデータを移行するような場合がありますので、 データ更新用のfunctionも欲しいかなぁと。いろいろと面倒くさい^^;

shumpei commented 12 years ago

DBをオープンして、オブジェクトストアを作って、って流れが自然に思えますよね。 吉川さんの提案したAPIも悪くないですが、定義して、その後getするというのが二度手間で、今のAPIよりめんどくさくなるのが難点ですね。 例えば、open()を一番最初に持ってくるようにするとか。ただこれだと、JDBDatabase.open()時に、実際にはindexedDB.open()は呼ばないという感じになります(実際に呼ぶのはinit()時)が・・・

var db = JDBDatabase.open("EmployeeDB", 1);

var EmployeeStore = db.createObjectStore({ name: 'EmployeeStore' }); var CompanyStore = db.createObjectStore({ name: 'CompanyStore' });

db.init().success(function() { });

shumpei commented 12 years ago

データ更新用のfunctionは、欲しい気持ちはすごくわかります。ぼくも、こないだ作っていたアプリで初期データの投入をDBアップグレード時にやりたかったので。 ただ、確かIE10がVERSION_CHANGEトランザクション中のput()を許容せずにエラーになっちゃうんですよ。だから、アップグレード時にデータ投入/更新は少しリスキーかも(ちなみにこないだ作っていたアプリでは、1秒おいてからデータ投入を行うことで、VERSION_CHANGEトランザクションのタイムアウトを待ちました・・・無理矢理過ぎる(^^; )

pikotea commented 12 years ago

なんと。そもそもスキーマ変更が動的にできないのがいやらしいですよね。

白石さんの案でいくのが一番良さそうですね。 openとinitを逆にしてはどうでしょう?

var db = JDBDatabase.init("EmployeeDB", 1);

var EmployeeStore = db.createObjectStore({ name: 'EmployeeStore' }); var CompanyStore = db.createObjectStore({ name: 'CompanyStore' });

db.open().success(function() { });

shumpei commented 12 years ago

白石さんの案でいくのが一番良さそうですね。 openとinitを逆にしてはどうでしょう?

なるほど、だとすると今とあんまり変わらないかな。 今はinit()ではなくnewでインスタンス作っているだけなので。

変更点としては、JDBObjectStoreの生成をnewではなくJDBDatabase.createObjectStore()でやる、というだけでもいいのかもしれません。メソッド名も、defineObjectStore()とかcreateStore()とかdefineStore()とか、いろいろ考えられそう。

ただ、瑣末な変更であることには変わりないので今は手を付けないでおいて、コードの分かりやすさだけではなく満たしたいユースケースとか、IndexedDB APIと齟齬がないようにするとか、そういう方から考えてみてもいいかもしれませんね。

2012年2月25日2:20 pikotea reply@reply.github.com:

なんと。そもそもスキーマ変更が動的にできないのがいやらしいですよね。

白石さんの案でいくのが一番良さそうですね。 openとinitを逆にしてはどうでしょう?

var db = JDBDatabase.init("EmployeeDB", 1);

var EmployeeStore = db.createObjectStore({ name: 'EmployeeStore' }); var CompanyStore = db.createObjectStore({ name: 'CompanyStore' });

db.open().success(function() { });


Reply to this email directly or view it on GitHub: https://github.com/shumpei/jdb.js/pull/6#issuecomment-4160923

pikotea commented 12 years ago

そうですね。 イニシャルデータの登録以外にも、文字列の前方マッチ、後方マッチ、部分マッチが欲しかったり(恐らくfilterのaliasみたいな感じになりそうですが)とか。

というかこういう雑談はここですることじゃないですねw あとで、まとめてポストしますー。