【Android】realmの使い方

高速かつ簡単にデータ保存ができるNoSQLライブラリのrealmを紹介します。

使うメリット

Sqliteよりも手続きが簡単で速度が速いので便利です。

使うデメリット

  • カラム変更は自分でプログラムをゴリゴリ書く必要があるので面倒です。
  • ListViewなどに超大量データを表示する時などはCursorAdapterにするのが好みですが、Sqliteじゃないので使えないです。

使い方

gradleの設定
さっそくbuild.gradleのdependenciesに以下を記載

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

ソースコード

public class TestModel extends RealmObject {

    private int id;
    private String name;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

DBの構造に合わせたモデルを用意します。
※セッターとゲッター以外のメソッドは記載してはいけません

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RealmResults<TestModel> results = null;

        addTestData();
        addTestdataBestVer(2, "test2");
        addTestdataBestVer(3, "test3");
        results = getTestData();

        for (final TestModel model : results) {
            Log.d("REALM_TEST", String.format("ID: %s  NAME: %s", model.getId(), model.getName()));
        }

        updateTestData(results);
        deleteTestData(results);

        for (final TestModel model : getTestData()) {
            Log.d("REALM_TEST2", String.format("ID: %s  NAME: %s", model.getId(), model.getName()));
        }
    }

    private void addTestData() {

        Realm realm = Realm.getInstance(this, "test_realm");
        TestModel model = null;

        realm.beginTransaction();
        model = realm.createObject(TestModel.class);
        model.setId(1);
        model.setName("test");

        realm.commitTransaction();
    }

    private void addTestdataBestVer(int id, String name) {

        TestModel model = new TestModel();
        model.setId(id);
        model.setName(name);

        addTestDataBestVer(model);
    }

    private void addTestDataBestVer(TestModel model) {

        Realm realm = Realm.getInstance(this, "test_realm");

        realm.beginTransaction();
        realm.copyToRealm(model);
        realm.commitTransaction();
    }

    private RealmResults<TestModel> getTestData() {

        Realm realm = Realm.getInstance(this, "test_realm");
        RealmQuery<TestModel> query = realm.where(TestModel.class);

//        query.equalTo("name", "test");
//        query.or().equalTo("id", 2);
//        query.or().equalTo("id", 3);

        return query.findAll();
    }

    private void deleteTestData(RealmResults<TestModel> result) {

        Realm realm = Realm.getInstance(this, "test_realm");
        TestModel model = result.get(0);

        realm.beginTransaction();
        result.remove(1);

        model.removeFromRealm();

//        result.clear();
        realm.commitTransaction();
    }

    private void updateTestData(RealmResults<TestModel> result) {

        Realm realm = Realm.getInstance(this, "test_realm");
        TestModel model = result.get(2);

        realm.beginTransaction();
        model.setName("UPDATE");
        realm.commitTransaction();
    }
}

Realm realm = Realm.getInstance(this, "test_realm");
のようにしてインスタンスを生成します。

INSERTはaddTestData、addTestDataBestVerメソッド
SELECTはgetTestDataメソッド
UPDATEはupdateTestDataメソッド
DELETEはdeleteTestDataメソッドを見てもらえれば分かるかと思います。

補足として、SELECTのコメントされている以下をコメント解除するとWHERE区付きとして動作します。

//        query.equalTo("name", "test");
//        query.or().equalTo("id", 2);
//        query.or().equalTo("id", 3);

また、DELETEのresult.clear();を実行するとデータを全件削除します。
※初めて触った時に知らないで実行してビックリした経験有り

この記事に書いたソースコード一式は以下にあります。
https://github.com/k-shimoju/android/tree/master/realm