Realm Sample
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.86.1'
ProGuardに下記を追加.
Realmはコンパイル時にRealmObjectのProxyを生成する. ProGuardがこれを壊さないために下記を追加する.
-keep class io.realm.annotations.RealmModule
-keep @io.realm.annotations.RealmModule class *
-keep class io.realm.internal.Keep
-keep @io.realm.internal.Keep class * { *; }
-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.3'
// セットアップして...
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 extends RealmObject>が関連付けのために使用される.
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
List list = RealmBrowser.getInstance().getRealmModelList();
if (list != null && !list.contains(Model.class)) {
RealmBrowser.getInstance().addRealmModel(Model.class);
}
RealmFilesActivity.start(this);
以上.