読者です 読者をやめる 読者になる 読者になる

アニマネ開発日誌

アニメアプリのアニマネの開発日誌です。

JSONで疲弊したら試したい、アプリのデータをSQLiteで受け渡すという選択肢

Objective-C Swift アプリ開発

アニマネの内部ではアプリとサーバー間でどのようにデータを受け渡ししているかという話をしてみます。

一般的にアプリとサーバー間のデータの受け渡しだとJSONXMLYAMLなどが多いと思います。
ここにSQLiteという選択肢を入れると色々幸せになれるという話です。

もはや何で今までJSONという固定観念が捨てられなかったのかというぐらい、個人的にはコロンブスの卵でした。
あまり事例はなさそうなので、ここで紹介してみます。

アニマネでの問題点

アニメアプリのアニマネでは主にアニメの番組表やニュースをサーバーから受け取って表示しています。
都道府県にもよりますが、一つの都道府県の1週間分の番組表(アニメだけ)をJSONにすると大体750KBぐらいになるんですね。

これを開発初期ではMessagePackに置き換えてました。

話の本筋とは関係ないですが、JSONよりはMessagePackの方が性能的にはベターです(iOSでしか確認してませんが)。
データ量はJSONより小さいし、展開時の速度も早いです。

もうデータがないので確認はできませんが、1000レコードぐらいデータを展開した時に、JSONとMessagePackで1秒ぐらい差がでました。
JSONやMessagePackのパーサーの性能に依存するので、正確にはフォーマットの比較ではないけど。)

ファイルもJSONに比べて10%〜20%ぐらいに軽量化されます。

それでもまとまった量のデータの扱いになると、やはりJSONやMessagePackでは扱いづらい。
絞込みやソートを行おうとすると自前で実装する必要があるので、さすがに大変です。

そんなこんなで思いついたのが、そうだsqliteを直接送ればいいじゃん!という方法。

これがアプリ開発においてはメリットだらけで開発がさくさく進みます。

扱いやすいデータ形式

DBなので当然扱いやすいです。

アニマネではユーザーのお気に入りの作品などはCoreData経由でSQLiteに保存していますので、 サーバーから取得したDBとリレーションを張ることでデータが簡単に取得できます。

アプリ起動時に最新の番組表が入ったsqliteファイルをダウンロードしてきて、 あとは通信せずにSQLiteからデータを取得して表示しています。

ライブラリはお馴染みのFMDBです。

絞込もソートも思いのままなので、これだけでもJSONから置き換える価値があります。

テキスト形式のプロトコルよりも軽量

内部でバイナリで保存されているせいか、データ量も軽量です。

アニマネのとあるデータだと下記のようになりました。

データ 容量
JSON 753KB
MessagePack 634KB
SQLite3 574KB

まとまったデータを扱うなら、この差は大きい。

データの正規化により、さらなるデータの圧縮が可能

SQLite3はRDBMSなので、テーブルを正規化すればデータの無駄を省けます。
アニマネの場合は先程574KBだったデータが346KBまで減りました。

あまり変更することのないマスターデータなどを先に持たせておけば、 容量の削減に大きく貢献します。

もちろんこういう手法はJSONとかでも既にやっていると思いますが、 その都度DBにアクセスして取得したりと実装に多少手間が掛かります。

SQLならまとめて取れるので、非常に楽です。

クロスプラットフォーム

JSONやMessagePackなどと同様にクロスプラットフォームのため、 サーバー側で予めsqliteのDBを用意できます。

JSONやMessagePack程手軽に用意はできませんが、一般的なプログラムレベルで簡単に用意ができます。

ローカルでデータが保持できる

当然ですがローカルでまとまった量のデータを保持できるのは魅力的です。

最近は地下鉄でも電波が届くところが多いですが、 オフラインでも利用できるとユーザーの利便性が大きく向上します。

暗号化に対応

セキュリティ的にもSQLiteは優れていて、DBを暗号化することができます。
(実際に試してはいないので断言はできませんが、仕組み上は可能と思われます。)

JSONとかのキャッシュが残っていると中身は丸見えなので、 ユーザーに見られてはまずいデータのやりとりにも最適ですね。

総評

とまあこんな感じでデメリットらしいデメリットはないと思います。
唯一あるとすればJSONエンコード/デコードすることに比べて、多少実装の手間が増えるぐらいでしょうか。

単純にAPIから受け取った結果20件ぐらいを表示するならJSONで十分と思いますが、 データ量が多かったり、複雑なビジネスロジックが絡む場合はSQLiteがよいと思います。

iOSの場合はCoreDataとの相性もよいので、とても使いやすいです。

JSONで色々やろうとして疲弊されているなら、ぜひSQLiteでの実装を検討してみて下さい。

2015.10.10追記

予想以上に反響を頂いたので、別エントリで補足しました。

animane.hatenablog.com

animane.hatenablog.com