Realm Browserで.realmファイルの中身を確認する(Android編)
Realmを使用する時に、実際に作成したDBの情報を確認する方法としてRealm Browserを使う方法とStetho-Realmを使う方法があります。 今回はAndroidでRealmのデータを作成後、Realm Browserで.realmファイルの中身を確認する方法を紹介します。
Realmを導入する
つい先日バージョンが上がったようで、2016/7/3現在の最新バージョンは1.1.0です。Realmを導入するにはプロジェクト直下のbuild.gradle
とRealmを使用するモジュール(通常はapp直下)のbuild.gradle
にそれぞれ以下の記述を追加します。
// プロジェクト直下 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.1.2' classpath "io.realm:realm-gradle-plugin:1.1.0" } }
// モジュール直下 apply plugin: 'realm-android'
Realmデータを保存する
Realmでデータを保存するにはRealmObject
を継承したデータクラスを定義し、トランザクション内でデータを作成しトランザクションをコミットします。基本的な使い方およびRealmの制限事項については公式のチュートリアルが分かりやすいので詳しくはそちらを参照してください。
今回は以下のようなBookShelf
クラスとBook
クラスを定義して保存してみます。
public class BookShelf extends RealmObject { private static final String TAG = BookShelf.class.getSimpleName(); private RealmList<Book> books; // getter/setterは省略 }
public class Book extends RealmObject { private static final String TAG = Book.class.getSimpleName(); private String title; private String author; private int pages; // getter/setterは省略 }
以下のコードでBookShelf
とBook
クラスを作成してRealmで保存します。
@InjectView(R.id.button_create) Button mButtonCreate; @InjectView(R.id.button_delete) Button mButtonDelete; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.inject(this); RealmConfiguration realmConfig = new RealmConfiguration.Builder(this).build(); Realm.setDefaultConfiguration(realmConfig); } @Override protected void onResume() { super.onResume(); mButtonCreate.setOnClickListener(v -> { Log.d("AAA", "Created"); createBookShelf(); }); mButtonDelete.setOnClickListener(v -> { Log.d("AAA", "Deleted"); deleteBookShelf(); }); } private void createBookShelf() { Realm r = Realm.getDefaultInstance(); // トランザクション開始 r.beginTransaction(); Book b = r.createObject(Book.class); b.setTitle("Extreme Programming"); b.setAuthor("Kent Beck"); b.setPages(181); Book b2 = r.createObject(Book.class); b2.setTitle("アジャイルサムライ"); b2.setAuthor("Jonathan Rasmusson"); b2.setPages(316); RealmList<Book> bookList = new RealmList<>(); bookList.add(b); bookList.add(b2); BookShelf shelf = r.createObject(BookShelf.class); shelf.setBooks(bookList); r.commitTransaction(); // トランザクション終了 r.close(); } private void deleteBookShelf() { Realm r = Realm.getDefaultInstance(); // 非同期処理開始 r.executeTransactionAsync(realm -> { realm.deleteAll(); // 非同期の場合は自動的にトランザクション処理が行われる }); r.close(); }
上記のコードでcreateBookShelf
を実行すると/data/data/アプリパッケージ名/files/
にdefault.realm
ファイルが作成されます。
Realm Browserで.realmファイルを確認する
Realm Browserを入手する
Realm BrowserはRealmのデータをGUIで確認するためのMac用アプリです。なお現在はWindowsおよびLinux版はないようです。RealmBrowserはApp Storeから入手できます。
RealmBrowserで.realmファイルをオープンするとデータベースの内容をグラフィカルに確認できます。
.realmファイルを取得する
それでは上記で作成したRealmのデータを端末から取得してRealm Browserで表示してみます。基本的にはadb pull
で端末からdefault.realm
を取得すればいいですが、この時少しコツがいります。
.realmファイルは/data/data/アプリパッケージ名/files/default.realm
に作成されますが、通常の端末ではセキュリティの制限によりアプリ領域のファイルを直接取得することができません。そのためadb pull
で直接default.realmを取得しようとしてもpermission deniedと怒られてしまいます。
この状態で.realmファイルを取得するには以下の手順を実行する必要があります。
adb shell
で端末のシェルを起動するrun-as パッケージ名
を実行するcp files/default.realm /sdcard/Download(コピー先は通常権限でアクセス可能な任意の場所)
でアプリ領域から公開領域にファイルをコピーする- 端末のシェルを抜ける
adb pull /sdcard/Download/default.realm
で端末からファイルを取得する
.realmファイルを読み込む
無事に目的のファイルが取得できたらRealm Browserでオープンします。今回作成したファイルを読み込むと以下のように表示されます。
ウィンドウ左側に表示されているModelsから任意のモデルを選択すると、そのモデルのデータが右側に表示されます。BookShelfを選択すると選択したBookShelfが持っているBookへの関連が表示されます。これを選択すると上の画像のように各Bookクラスの内容が表示されます。
サンプルコード
以下でサンプルを公開しています。