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