Realmはレアルムではなく、レルム

外国語のカタカナ読みを議論するのは不毛だと思うけど、なんて読んでいいのかわからないのも困るので、Realmはレルムと読むそうです。(not レアルム)
Realmは、SQLiteやCoreDataに置き換わるモバイルデータベース。
SQLiteのORマッパーではないという注意書きを付けたくなるほど使いやすいらしい。
詳しい説明はこちらからどうぞ。

使ってみた感想は「もうSQLiteには戻れない」です。

Java(Android)でRealmを使う簡単な手順を説明します。
Android Studioでプロジェクトを作成したら、build.gradleを編集します。
build.gradle(Project)にはclasspathを追加します。

    dependencies {
        classpath 'com.android.tools.build:gradle:2.1.0'
        classpath "io.realm:realm-gradle-plugin:1.0.0"	// 追記(ついに1.0.0!)

build.gradle(Module)にはpluginを追加します。

apply plugin: 'com.android.application'
apply plugin: 'realm-android'		// 追記

たとえば、何かの会のメンバーを登録して、ある条件で抽出して画面に表示する処理を作成してみます。
まず、Memberクラスを作成します。

package com.example.kanehiro.tryrealm;

import io.realm.RealmObject;

public class Member extends RealmObject {
    private long id;
    private String name;
    private boolean admin;

    public String getName() {
        return name;
    }

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

    public long getId() {
        return id;
    }

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

    public boolean getAdmin() {
        return admin;
    }

    public void setAdmin(boolean admin) {
        this.admin = admin;
    }

}

Memberクラスには、idと名前、そしてadmin(管理者)かどうのかブール値(真偽値)を持たせます。
そして、それぞれのプロパティにgetterとsetterを用意します。
次にアクティビティのコードです。

package com.example.kanehiro.tryrealm;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.TextView;

import io.realm.Realm;
import io.realm.RealmConfiguration;
import io.realm.RealmResults;

public class MainActivity extends AppCompatActivity {

    private Realm realm;
    private RealmConfiguration realmConfig;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // Create the Realm configuration
        realmConfig = new RealmConfiguration.Builder(this).build();

        new AsyncTask<Void, Void, String>() {
            @Override
            protected String doInBackground(Void... voids) {
                String info;
                memberWrite();
                info = memberQuery(false);
                memberDelete();
                return info;
            }

            @Override
            protected void onPostExecute(String result) {
                TextView txt01 = (TextView)findViewById(R.id.txt01);
                txt01.setText(result);
            }
        }.execute();

    }
    private void memberWrite() {

        Realm realm = Realm.getInstance(realmConfig);

        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                for (int i = 0; i < 30; i++) {
                    Member member = realm.createObject(Member.class);
                    member.setId(i);
                    member.setName("Member" + i);
                    if ((i % 3) == 0){
                        member.setAdmin(true);
                    }
                }
            }
        });
        realm.close();
    }
    private String memberQuery(boolean admin) {

        StringBuilder strBuild = new StringBuilder();
        Realm realm = Realm.getInstance(realmConfig);
        RealmResults<Member> results = realm.where(Member.class)
                .equalTo("admin", admin).findAll();
        for (Member m : results) {
            strBuild.append(m.getId());
            strBuild.append(",");
            strBuild.append(m.getName());
            strBuild.append("\n");

        }

        realm.close();
        return strBuild.toString();
    }

    private void memberDelete() {
        Realm realm = Realm.getInstance(realmConfig);
        realm.executeTransaction(new Realm.Transaction() {
            @Override
            public void execute(Realm realm) {
                realm.delete(Member.class);
            }
        });
        realm.close();
    }
}

onCreateメソッドから見ていきましょう。RealmConfiguration.BuilderでRealm configurationオブジェクトを生成します。
追加するレコードの件数は少ないけど、AsyncTaskクラスを使って非同期に書き込み、読み込み、削除を実行します。
抽出結果はテキストビューに表示します。
memberWriteメソッドでMemberを書込みます。まず、Realm.getInstanceでRealmを取得します。
書き込み(追加、変更、削除)処理は、トランザクションの中で行わなければなりません。
ここでは、トランザクションブロックを使っています。realm.executeTransactionの部分です。
トランザクションはexecuteTransactionメソッドを抜けたタイミングでコミットされます。
memberQuery()で、クエリーを発行しています。whereにクラスを指定して、.equalToなどで検索条件を指定します。
ここではadminかどうかが検索条件です。findAll()で取得します。
次に取得した結果セットをループしてgetterで値を取得し、文字列として返します。
memberDelete()では、realm.delete(Member.class)で全オブジェクトを削除しています。
adminじゃないMemberを抽出した結果が次の画像です。
tryrealm実行結果

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です