Android Realm BrowserでRealmDBをのぞく

# Realm Sample

Android Realm BrowserでRealmの中身をのぞいてみるサンプル. 
[サンプルプロジェクトはこちら](https://github.com/YukiMatsumura/RealmSample)


## はじめに

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

 - [パフォーマンス](http://realm.io/news/realm-for-android/#realm-for-android)はSQLiteやOrmLite, greenDAO等のORMよりもInsert/Count/Queryそれぞれ数倍高速に動作する.  
 - [暗号化機能](http://realm.io/docs/java/latest/#encryption)も備えており, パフォーマンスは通常時と比べてもほぼ変わらない. 
 - 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に下記を追加. 

```gradle
compile 'io.realm:realm-android:0.86.1'
```

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

```text
-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](http://realm.io/jp/docs/java/latest/#realm-browser)  

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

Androidデバイス上でデータベースを閲覧するライブラリもある. 
[Android Realm Browser](https://github.com/dmytrodanylyk/realm-browser)

build.gradleに下記を追加. 

```gradle
compile 'com.github.dmytrodanylyk.realm-browser:library:0.0.3'
```

```java
// セットアップして...
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>が関連付けのために使用される.  

```java
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へ書き込み.  

```java
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](https://github.com/YukiMatsumura/RealmSample/blob/master/app/src/main/java/yuki/m/android/realmsample/MainActivity.java#L63)

```java
List list = RealmBrowser.getInstance().getRealmModelList();
if (list != null && !list.contains(Model.class)) {
    RealmBrowser.getInstance().addRealmModel(Model.class);
}
RealmFilesActivity.start(this);
```

以上.