Cordova アプリでローカル DB を実現するには

Cordova アプリで、ローカル DB 的なことを実現する方法を検討する。今回対象にするのは iOS アプリの実装を前提とするため、Android への考慮は少なめ。

ローカル DB の種類

Cordova アプリはフロントエンド技術だけでアプリを構築できるため、基本的には Web 標準、HTML5 で採用されている技術が使用できると考えて良い。

ローカル DB として使えそうな技術の種類は以下のとおり。

このあたりの技術が、クライアントサイドだけでデータを保持できる仕組みとなる。

ではどの技術を使おうか、もしくは使えるか、という話になる。

iOS の対応状況

結論からいうと、iOS では IndexedDB にバグが多く使わない方が良い。小規模なら WebStorage、大規模なら WebSQL のバックエンドエンジンに採用されている SQLite を直に利用するのが良さそう、ということだ。

以下、それぞれの技術の問題点などをまとめる。

WebStorage (SessionStorage・LocalStorage) は問題なし

Cordova で作った iOS アプリ上での、WebStorage の利用は特に問題ないようだ。

SessionStorage の「セッション」の扱いがどこになるのか、細かく書いてあるサイトが見当たらなかったのだが、恐らくは「アプリをアプリスイッチャーから終了させるまで」になるのではないかと思われる。ちゃんと試していないので情報募集。

iOS における IndexedDB の対応状況

なかなか新しめの文献がなく苦労したのだが、それぞれ参考にしたサイトを以下に列挙しておく。

iOS における IndexedDB の対応状況はというと、

とのこと。これ以上新しい iOS ではどうなのか、文献がなかった。ちなみに Android は v4.3 以前がネイティブサポートなし。

IndexedDBShim は、こうした IndexedDB がサポートされていない部分に割り込んで動作し、サポートされていれば何も影響しない、という作りになっているようだ。

IndexedDB は心配。

というわけで、iOS で IndexedDB を使おうとすると、IndexedDBShim を噛ませて、実際には WebSQL を使用することになりそうだ。

であれば、最初から WebSQL を使った方が、余計なバグに遭遇しなくて済むであろう。

もっといえば、WebSQL 自体は HTML5 の標準仕様から外れているので、できれば WebSQL が内部で使用している SQLite を Cordova アプリ内で直接持って操作できれば、一番確実かと思う。

Cordova アプリで SQLite を扱えるプラグイン

すると既にそういうプラグインが存在していた。cordova-sqlite-storage というプラグインだ。基本的には WebSQL の API に近い記述方法で、SQLite に向かって生の SQL を投げ付けて実行する方式になる。

iOS で「WebSQL」に対応しているか、という話を調べようとすると、すぐこの cordova-sqlite-storage プラグインに行き着いてしまったので、WebSQL API がほとんどそのまま使えることだし、この際これで良いだろう。

次回はこの cordova-sqlite-storage の導入について解説する。