外国語のカタカナ読みを議論するのは不毛だと思うけど、なんて読んでいいのかわからないのも困るので、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を抽出した結果が次の画像です。
実行結果

実行結果
