高速な動作をうたうモバイルデバイス向けDMBSのRealmを利用した経験から、ちゃんとRealmの性能を発揮するために、必要なノウハウを貯めたので共有します。
個人の感想やコンテキストへの依存も入っているので、曖昧な部分もあります。
環境はRealm Android 0.82.1
- Realm使うならがっつり依存しとけ
- 遅延ロードの仕組みを活用しよう
- スレッド間通信はできない(今のところ)
- 書き込むときの注意すること
- テストの制約
- 読み込んだデータを一気にメモリに展開する設計にはしない
- RealmObjectはDBから読み込まれても、すぐにメモリに値を展開しない
- 遅延ロードを利用して、必要なときに読み込んで展開をする
- 速度やリソース的なあれでメリットがあるので積極的に活用をしよう
- スレッド間に通信データのやりとりをするときは、idのやりとりのみにする
- Realmインスタンス及びRealmObjectは生成されたスレッド内でしか利用できない
- バックグラウンドで読んでフォアグラウンドで描画的なパターンは不可能
- フォアグラウンドで読み込む
- 将来的には変更されるらしいけど、フォアグラウンドで読み込んでても不自由ない速度なので別に構わないかなって
- ユニークなIDが重複すると容赦なく例外が投げられる
- 実行時例外なのが辛い
- 重複しうるデータが生成し、書き込み時にチェックするのが面倒ならば
copyToRealmOrUpdate
するのでもいい - 状況に応じて・・・
- プリミティブな型のコレクションは持てない
RealmLong
とかでラップする必要がある(これは直るっぽいけど)
- JVM上でのテストはできない
- 必ずConnected Android Teastにしないとだめ
- DBファイルは
RealmConfiguration
で設定ができるので、テスタブルにするためDIとかでいけるようにすると良さそう UiThreadTest
とかを利用する時は、Before
やAfter
で実行されるメソッドと別スレッドでテストメソッドが実行されるので注意。Realmの準備もテストメソッド内で行う必要があるよ- Realmの削除は実装コード、テストコードの全てでcloseしてないと失敗するので注意。
assertionError
が出て実装コード側でcloseされることなく削除しようとして失敗した回数数知れず
- 普通のDBMSと比較して、特殊な部分は多い(スレッドとか特に)
- 互換性をもたせた抽象化は大変
- 依存するならがっつりと依存したほうが良さげ