Realm Advent Calendar二日目を担当する@zaki50です。
Realmを使っていると、実際に保存されているデータを確認したくなることがあります。
今回は、そのための方法の一つであり、私が以前作成したStetho-Realmについて書きたいと思います。今回の記事は、Androidが対象です。iOSの方はごめんなさい。
と言っても、セットアップについてはStetho で Realm のデータを確認する stetho-realmというエントリがあるので、こちらを参照していただいて、今回はStetho-Realmが持っている設定について書こうと思います。通常はデフォルトのままで便利に使えるのですが、知っておくと何かの役に立つかもしれません。
このツールはもともと、DroidConモントリオールに参加した際、Facebookの人がStethoの発表を、Indigogoの人がRealmの発表をしていたのを聞いて興味をもった私が両方のソースコードを眺めていた時に、これ組み合わせられるのではないかと思ったのが始まりです。当初は実用性はあまり意識せずになんとなくコードを書き始めたのですが、意外にも使ってもらえているようで嬉しい限りです。
Stetho-Realmの紹介
このツールのことを知らない人もいると思うので簡単に紹介すると、Stethoというツールを使ってRealmのデータを見られるようにしようというものです。
Stethoは、Chrome Browserが持っているPC上のChromeからAndroid上のChromeをデバッグするための機能を利用して、Android上で動いているAndroidアプリの情報をPC上のChromeから読み書きできるようにしてしまおうというものです。
このStethoには、Android端末上のSQLiteのファイルへアクセスする機能がもともと用意されていて、SQLiteデータベースの内容を確認することができます。
Stetho-Realmでは、SQLite用のモジュールを独自に作成したRealm用のモジュールに差し替えることで、UIをそのままにRealmのデータを表示できるようにしています。
設定項目
設定は、RealmInspectorModulesProvider
を作成するためのビルダーで行います。
デフォルトの設定で使う場合は、RealmInspectorModulesProvider.builder(this).build()
で済ませてしまう部分で、設定用のメソッドを呼び出すと様々な設定を行うことができます。
データベースファイルを探すためのフォルダを指定する(withFolder()
)
デフォルトでは、アプリ用のストレージの中のfiles
フォルダからデータベースファイルを探します。これは、Realm自体のデフォルトの挙動と同じです。
アプリによっては別の場所に保存している場合もあるかと思いますが、その際はこのメソッドでパスを指定してください。
暗号化されたファイル用のキーを設定する(withDefaultEncryptionKey()
, withEncryptionKey()
)
Realmのデータベースは、ファイルごとに個別のキーで暗号化することができます。暗号化されたデータベースファイルはキーを指定しないと中身を表示することができません。
withDefaultEncryptionKey(byte[])
に、キーのバイト配列を渡すと、すべてのデータベースファイルに対してこのキーを使用してアクセスします。
また、withEncryptionKey(String,byte[])
を使うと、個別のデータベースファイルに対してのみキーを指定することができます。withDefaultEncryptionKey(byte[])
でデフォルトキーが指定されている場合でも個別指定のキーが優先されます。
データの表示件数の上限を指定する(withLimit()
)
各テーブルのデータはデフォルトでは250件までしか表示されないようになっています。これは、Stethoの仕様上一度にすべてのデータを送る必要があり、上限を設けないと大きなテーブルで問題になるからです。
withLimit(long)
に件数を指定すると、指定した件数のデータまで表示できるようになります。
あまり大きな値を指定すると表示に時間がかかってしまうので、仕様する際は気をつけてください。
表示順を変更する(withDescendingOrder()
)
テーブル内のデータは、内部的に管理されているインデックスの値に従ってソートされて表示されます。
デフォルトでは昇順で表示されますが、withDescendingOrder()
を呼び出すことで降順に変更することができます。
データの表示件数は増やしたくないが、一番う白のデータを見たいような場合に役立ちます。
データベースファイルの名前のパターンを指定する(databaseNamePattern()
)
ファイル名が.realm
で終わるものをRealmデータベースファイルとみなして扱いますが、このルールに従わない場合にファイル名のパターンを正規表現で指定することができます。
メタテーブルの表示(withMetaTables()
)
Realmのデータベースファイルの中には、metadata
という名前のテーブルがあります。実は私もこのテーブルが何に使われているのが知らないのですが、通常は表示しても意味がないので非表示になっています。withMetaTables()
を呼び出すことで、このテーブルも一覧に表示されるようになります。
全部入り設定
ここまで紹介した設定を全部記述したRealmInspectorModulesProvider
生成コードは以下のようになります。
RealmInspectorModulesProvider.builder(this)
.withFolder(getCacheDir())
.withDefaultEncryptionKey(defaultKey)
.withEncryptionKey("encrypted.realm", key)
.withDescendingOrder()
.withLimit(1000)
.withMetaTables()
.databaseNamePattern(Pattern.compile(".+\\.realm"))
.build()
今後の予定
以上、ツールの簡単な紹介と設定項目について紹介させていただきました。
現状でも便利に使えるのですが、いくつか欲しいなと思っている機能があるので書いておきます。我こそはという方はぜひプルリクエストを送ってください!
カラムの定義情報の表示
現状では、カラムの名前しか表示していません。型はまぁわかっているはずだし表示しなくてもいいかなと思っていたのですが、Realm Java 0.83.0で導入されたnullサポートの確認をするために、nullableかどうかの表示をしたいなと思っています。他にも、インデックスの存在やプライマリキーかどうかについてもわかりやすく表示したいと思います。
読み込み以外のサポート
Chromeのdev toolでは、読み込みだけでなく任意のSQL文を発行することができます。Realmはリレーショナルデータベースではないし、SQLのサポートもありません。とはいえ、SQLが発行できればデータの変更もできるようになり便利であることは間違いありません。完全なSQLサポートは不要だと思いますが、単純なINSERTやUPDATEはできるといいかなと思っています。