PhoneGapでLocalDatabaseを使ってみる その2
PhoneGapでLocalDatabaseを使ってみる - おかひろの雑記では、簡単なSQL文を動かしてみました。
今回は、LocalDatabaseの制約やレスポンスについてちょこっと試してみたので、そのメモ。
あくまで、どんなものなのか感覚をつかみたかっただけなので、大したことはやっていません。
テーブル
- tableA
- id unique
- name
- tableB
- id unique
- a_id
- name
create table if not exists tableA(id unique,name) create table if not exists tableB(id unique,a_id int,name)
ダミーデータをtableAに15,000件、tableBはtableAのデータそれぞれに3件ずつで45,000件、合計60,000件プログラムで投入しました。
実行速度
検索処理
特定のIDからデータを検索(count+結合)
select t1.id id1,t1.name name1,count(t2.id) as count2 from tableA t1,tableB t2 where t1.id = t2.a_id and t1.id = ? group by t1.id,t1.name
シミュレーター | 15ms程度 |
iPod touch(第4世代) | 160ms程度 |
iPad2 | 80ms程度 |
全データ検索(count+結合+limit)
select t1.id id1,t1.name name1,count(t2.id) as count2 from tableA t1,tableB t2 where t1.id = t2.a_id group by t1.id,t1.name limit 100
シミュレーター | 100ms程度 |
iPod touch(第4世代) | 1300ms程度 |
iPad2 | 650ms程度 |
結構時間がかかります。
ただし、indexを適切に設定してあげると、いずれも10ms以内に収まり、高速に動作するようになります。
上のSQLの場合だと、とりあえずこんな感じのindexで。
create index idx2 on tableB(a_id)
データベースの容量制限
データの容量は5MBまで(インデックスなども含めると、もっと少ないほうがよいとのこと)という制約があるようで、それを超えるとこんなエラーが発生します。
there was not enough remaining storage space, or the storage quota was reached and the user declined to allow more space
しかも、これはerrorコールバック関数でmessageプロパティをコンソールやalertなどで表示しないとわからないので注意が必要です。
うまく行ったように見せかけて、実は上限オーバー分はデータが入っていないという状態になりえそうです。
まとめ
- 1レコードあたりのデータ容量にもよりますが、10,000〜20,000件程度のデータであれば問題なく使えそうです
- indexを設定すれば、検索速度は結構早いのではないかと思います
参考にさせていただいたサイト
「iPad用HTML5ゲームを作り公開する – PART 2」 - 読み書きプログラミング ブログ
なお、iOSのSQLiteにアクセスできるようにするプラグインがあるようです。
試したら、ブログに書いていこうと思います。
GitHub - davibe/Phonegap-SQLitePlugin: A phonegap plugin to open and use sqlite databases on iOS.