techium

このブログは何かに追われないと頑張れない人たちが週一更新をノルマに技術情報を発信するブログです。もし何か調査して欲しい内容がありましたら、@kobashinG or @muchiki0226 までいただけますと気が向いたら調査するかもしれません。

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は省略
}

以下のコードでBookShelfBookクラスを作成して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から入手できます。

Realm Browser

Realm Browser

  • Realm
  • 開発ツール
  • 無料

RealmBrowserで.realmファイルをオープンするとデータベースの内容をグラフィカルに確認できます。

.realmファイルを取得する

それでは上記で作成したRealmのデータを端末から取得してRealm Browserで表示してみます。基本的にはadb pullで端末からdefault.realmを取得すればいいですが、この時少しコツがいります。

.realmファイルは/data/data/アプリパッケージ名/files/default.realmに作成されますが、通常の端末ではセキュリティの制限によりアプリ領域のファイルを直接取得することができません。そのためadb pullで直接default.realmを取得しようとしてもpermission deniedと怒られてしまいます。

この状態で.realmファイルを取得するには以下の手順を実行する必要があります。

  1. adb shellで端末のシェルを起動する
  2. run-as パッケージ名を実行する
  3. cp files/default.realm /sdcard/Download(コピー先は通常権限でアクセス可能な任意の場所)でアプリ領域から公開領域にファイルをコピーする
  4. 端末のシェルを抜ける
  5. adb pull /sdcard/Download/default.realmで端末からファイルを取得する

.realmファイルを読み込む

無事に目的のファイルが取得できたらRealm Browserでオープンします。今回作成したファイルを読み込むと以下のように表示されます。 f:id:snishimura0926:20160703225310p:plain

ウィンドウ左側に表示されているModelsから任意のモデルを選択すると、そのモデルのデータが右側に表示されます。BookShelfを選択すると選択したBookShelfが持っているBookへの関連が表示されます。これを選択すると上の画像のように各Bookクラスの内容が表示されます。 f:id:snishimura0926:20160703225015p:plain

サンプルコード

以下でサンプルを公開しています。

github.com