Skip to content

Instantly share code, notes, and snippets.

@numa08
Last active August 31, 2015 11:03
Show Gist options
  • Save numa08/231617b4b1b66fdc4f25 to your computer and use it in GitHub Desktop.
Save numa08/231617b4b1b66fdc4f25 to your computer and use it in GitHub Desktop.
Realmの話

Realmを正しく使うには?

高速な動作をうたうモバイルデバイス向けDMBSのRealmを利用した経験から、ちゃんとRealmの性能を発揮するために、必要なノウハウを貯めたので共有します。

個人の感想やコンテキストへの依存も入っているので、曖昧な部分もあります。

環境はRealm Android 0.82.1

TL;DL

  • Realm使うならがっつり依存しとけ

アジェンダ

  • 遅延ロードの仕組みを活用しよう
  • スレッド間通信はできない(今のところ)
  • 書き込むときの注意すること
  • テストの制約

遅延ロードの仕組みを活用しよう

  • 読み込んだデータを一気にメモリに展開する設計にはしない
  • RealmObjectはDBから読み込まれても、すぐにメモリに値を展開しない
  • 遅延ロードを利用して、必要なときに読み込んで展開をする
  • 速度やリソース的なあれでメリットがあるので積極的に活用をしよう

スレッド間通信はできない

  • スレッド間に通信データのやりとりをするときは、idのやりとりのみにする
  • Realmインスタンス及びRealmObjectは生成されたスレッド内でしか利用できない
  • バックグラウンドで読んでフォアグラウンドで描画的なパターンは不可能
  • フォアグラウンドで読み込む
  • 将来的には変更されるらしいけど、フォアグラウンドで読み込んでても不自由ない速度なので別に構わないかなって

書き込みで注意をしたいこと

  • ユニークなIDが重複すると容赦なく例外が投げられる
  • 実行時例外なのが辛い
  • 重複しうるデータが生成し、書き込み時にチェックするのが面倒ならばcopyToRealmOrUpdateするのでもいい
  • 状況に応じて・・・
  • プリミティブな型のコレクションは持てない
  • RealmLongとかでラップする必要がある(これは直るっぽいけど)

テストの制約

  • JVM上でのテストはできない
  • 必ずConnected Android Teastにしないとだめ
  • DBファイルはRealmConfigurationで設定ができるので、テスタブルにするためDIとかでいけるようにすると良さそう
  • UiThreadTestとかを利用する時は、BeforeAfterで実行されるメソッドと別スレッドでテストメソッドが実行されるので注意。Realmの準備もテストメソッド内で行う必要があるよ
  • Realmの削除は実装コード、テストコードの全てでcloseしてないと失敗するので注意。assertionErrorが出て実装コード側でcloseされることなく削除しようとして失敗した回数数知れず

まとめ

  • 普通のDBMSと比較して、特殊な部分は多い(スレッドとか特に)
  • 互換性をもたせた抽象化は大変
  • 依存するならがっつりと依存したほうが良さげ
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment