2015/05/12

Android Realm BrowserでRealmDBをのぞく

Android Realm BrowserでRealmの中身をのぞいてみるサンプル.
サンプルプロジェクトはこちら

はじめに

Realmはモバイル向けに作られた軽量なNoSQL Database.
下記はAndroid向けに作られたrealm-javaについての記載である.

  • パフォーマンスはSQLiteやOrmLite, greenDAO等のORMよりもInsert/Count/Queryそれぞれ数倍高速に動作する.
  • 暗号化機能も備えており, パフォーマンスは通常時と比べてもほぼ変わらない.
  • iOS向けにも提供されている(クロスプラットフォーム).
  • ContentProviderの実装と比べて恐ろしく簡単に実装でき, 使い方も容易.

動作要件

realm-javaの動作要件は下記.

  • only Android.
  • AndroidStudio 0.8.6 or later.
  • latest Android SDK.
  • JDK 7 or later.
  • Android API Level 9 or higher.

準備

build.gradleに下記を追加.

compile 'io.realm:realm-android:0.80.1'

ProGuardに下記を追加.
Realmはコンパイル時にRealmObjectのProxyを生成する. ProGuardがこれを壊さないために下記を追加する.

-keepnames public class * extends io.realm.RealmObject
-keep class io.realm.** { *; }
-dontwarn javax.**
-dontwarn io.realm.**

Browse

Realmのデータベースを覗くソフトがMacOSX向けにリリースされている.
Realm Browser

アプリケーションフォルダ/files下に出力されたrealmファイルをこれにかませると中身をみられる.

Androidデバイス上でデータベースを閲覧するライブラリもある.
Android Realm Browser

build.gradleに下記を追加.

compile 'com.github.dmytrodanylyk.realm-browser:library:0.0.2'
// セットアップして...
RealmBrowser.getInstance().addRealmModel(Model.class);

// 閲覧用のActivityを呼び出せばok
RealmFilesActivity.start(this);

Model

Realmでのモデル定義. クラス自体はシンプルだが制約がある.

  • 主キーには@PrimaryKeyアノテーションを付与.
  • getter/setterはRealmのproxyオブジェクト生成のためだけに必要. getter/setterは実行されない
  • getter/setter以外のメソッドは定義できない

Realm向けのModelクラスは完全にRealm専用とした方が良い.
Realmがサポートするデータ型は boolean, short, ìnt, long, float, double, String, Date, byte[].
Realmではshort, int, longがすべてlong型として扱われる.
また, 1対多, 多対多なリレーションのためにRealmObjectのサブクラスとRealmList

public class Model extends RealmObject {
    @PrimaryKey
    private String pk;
    private int value;

    public String getPk() {
        return pk;
    }

    public void setPk(String pk) {
        this.pk = pk;
    }

    public int getValue() {
        return value;
    }

    public void setValue(int value) {
        this.value = value;
    }
}

Realm Databaseへ書き込み.

Realm realm = Realm.getInstance(this, "test.realm");
realm.executeTransaction(new Realm.Transaction() {
    @Override
    public void execute(Realm realm) {
        Model model = realm.createObject(Model.class);
        model.setPk(UUID.randomUUID().toString());
        model.setValue(new Date().getTime());
    }
});
realm.close();

Android Realm Browserで結果を見る. MainActivity

// セットアップして...
RealmBrowser.getInstance().addRealmModel(Model.class);

// 閲覧用のActivityを呼び出せばok
RealmFilesActivity.start(this);

以上.