はじめに
1年以上前(2021年1月)に下記の記事を書きました。
Realm、Couchbase Liteからはじめ、色々とマイナーなものを取り上げたものの、影響力に鑑みて、Android Roomを無視するわけには〜OSレベルの汎用性は別として〜いかないと考え、調査を始めた記録を覚書として残します。
上記記事を執筆したモチベーションは、業界の技術動向を理解した上で、Couchbase Lite/Mobileを、その中に位置付けることでした。Couchbase Mobileについては、以下参照ください。
Couchbase Mobileは、NoSQL組み込みデータベースCouchbase Lite、およびCouchbase ServerとCouchbase Liteとのデータ同期を担うSync Gatewayからなります。
Couchbase Serverについては、次の拙著を紹介させていただきます。
RoomとRealmの比較
Realm
メリット
・速い
動作はSQLiteよりも早く、
・iosとAndroidともに対応
デメリット
apkファイルを2.5MB増加させる
Room
メリット
・SQLiteデータベースにアクセスする処理がとても簡単に記述できます。
・SQLの中に現れるカラム名のミスなどがコンパイル時にエラーとして検出できることが強みです。
・LiveDataと一緒に使えばデータ変更を検知してUIを更新するような処理がとても簡単に記述できます。
デメリット
Swiftにはない
Android Room
Room は、SQLite 全体を対象とする抽象化レイヤを提供し、SQLite を最大限に活用しつつ、スムーズなデータベース アクセスを可能にします。
比較的大量の構造化データを処理するアプリは、そのデータをローカルに永続化することで大きなメリットを得ることができます。最も一般的なユースケースは、関連データのキャッシュを保存することです。これにより、デバイスがネットワークにアクセスできない場合でも、ユーザーはオフラインでコンテンツを閲覧することができます。ユーザーがコンテンツに変更を加えた場合は、デバイスがオンラインに戻った後にサーバーに同期されます。
Room を使用すれば、このような処理が自動的に実行されるため、SQLite の代わりに Room を使用することを強くおすすめします。SQLite API を直接使用したい場合は、SQLite を使用してデータを保存するをご覧ください。
注: 上記の API は強力ですが、極めてローレベルであるため、活用するにはかなりの時間と労力が必要となります。
RAW SQL クエリはコンパイル時に検証されません。データグラフに変更があった場合、影響を受ける SQL クエリを手動でアップデートする必要があります。これは、時間がかかり、エラーも発生しやすいプロセスです。
SQL クエリとデータ オブジェクトを変換するには、大量のボイラープレート コードを記述する必要があります。
Android Room
Room アーキテクチャー
(画像は上述の公式ドキュメントRoom を使用してローカル データベースにデータを保存するより引用)
オブジェクト間のリレーション
SQLite はリレーショナル データベースであるため、エンティティ間のリレーションを指定できます。ほとんどのオブジェクト リレーショナル マッピング ライブラリにおいて、エンティティ オブジェクト間の相互参照が可能ですが、Room では明示的に禁止されています。
- 埋め込みオブジェクト
- 1 対 1 のリレーション
- 1 対多のリレーション
- 多対多のリレーション
- ネストされたリレーション
最後に
下記の記事には、Realmを利用した簡単なアプリのサンプルがあるので、実際に動作確認の上、Room利用版を作ってみても面白そうだと考えています。
関連情報