Cordova アプリでローカル DB を実現するには
Cordova アプリで、ローカル DB 的なことを実現する方法を検討する。今回対象にするのは iOS アプリの実装を前提とするため、Android への考慮は少なめ。
ローカル DB の種類
Cordova アプリはフロントエンド技術だけでアプリを構築できるため、基本的には Web 標準、HTML5 で採用されている技術が使用できると考えて良い。
ローカル DB として使えそうな技術の種類は以下のとおり。
- WebStorage … SessionStorage と LocalStorage。昔の「クッキー」の優秀版、みたいな。
- IndexedDB … Web Storage より高機能。
- WebSQL … SQLite を使ってローカル DB を構築する仕様だが、HTML5 の標準仕様からは外されている。
このあたりの技術が、クライアントサイドだけでデータを保持できる仕組みとなる。
ではどの技術を使おうか、もしくは使えるか、という話になる。
iOS の対応状況
結論からいうと、iOS では IndexedDB にバグが多く使わない方が良い。小規模なら WebStorage、大規模なら WebSQL のバックエンドエンジンに採用されている SQLite を直に利用するのが良さそう、ということだ。
以下、それぞれの技術の問題点などをまとめる。
WebStorage (SessionStorage・LocalStorage) は問題なし
Cordova で作った iOS アプリ上での、WebStorage の利用は特に問題ないようだ。
SessionStorage の「セッション」の扱いがどこになるのか、細かく書いてあるサイトが見当たらなかったのだが、恐らくは「アプリをアプリスイッチャーから終了させるまで」になるのではないかと思われる。ちゃんと試していないので情報募集。
iOS における IndexedDB の対応状況
なかなか新しめの文献がなく苦労したのだが、それぞれ参考にしたサイトを以下に列挙しておく。
- 参考 : GitHub - Microsoft/cordova-plugin-indexedDB: Cordova plugin for IndexedDB … 「cordova-plugin-indexeddb」という、IndexedDB を使用できるようにする Cordova プラグイン。Microsoft 製のようだ。ベースにしているのは「IndexedDBShim」というライブラリ。
- 参考 : GitHub - axemclion/IndexedDBShim: A polyfill for IndexedDB using WebSql … IndexedDBShim って何?というと、iOS ネイティブの IndexedDB にはバグや未対応の機能があり、このライブラリが IndexedDB の API を書き換えて、内部的には WebSQL を使うようにしてくれているらしい。
- 参考 : Plugin Search - Apache Cordova … IndexedDB 関連の Cordova プラグインは3種類。うち一つが上述の「cordova-plugin-indexeddb」。
- 参考 : GitHub - emcniece/cordova-plugin-indexedDB2: Version 2 of the outdated M$ Cordova plugin for IndexedDB … 前述の「cordova-plugin-indexeddb」は開発がストップしているらしく、有志がアップグレード版を提供している。が、これも Cordova CLI のバージョンを v3 系と想定しているので、だいぶ古いかもしれない (本記事執筆時点では
cordova@7.0.1
が最新版)。 - 参考 : cordova-plugin-indexeddb-async - npm … これも類似の、IndexedDBShim ベースの Cordova プラグイン。
iOS における IndexedDB の対応状況はというと、
- iOS7 以前は IndexedDB のサポートなし。
- iOS8 からネイティブサポートされたが、バグが多い。
とのこと。これ以上新しい 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 の導入について解説する。