これは何
Realmを導入した手順のメモ
最低限の手順でありRealmの機能紹介や良さの説明はしていないので注意
前提条件
- Android Studio 2.1.2
- RoBoHoN(Android 5.0.2 Lollipop API21)
- Windows 10
- Realm Java 2.1.0
- Lombok 1.16.10
ライブラリバージョンは2016/10/26時点の最新版
公式で最新版を確認してください
realm公式:https://realm.io
realm公式手順:https://realm.io/docs/java/latest/#getting-started
Realm導入
- build.gradle (Prpoject)
プロジェクトのbuild.gradleのbuildscript→dependenciesに下記を追加
classpath "io.realm:realm-gradle-plugin:2.1.0"
- build.gradle(Module:App)
モジュールのbuild.gradleの直下に下記を追加
apply plugin: 'realm-android'
Lombok導入
Realmを使う上で必須ではないがGetter/Settterなど省略できるので一緒に導入
取りあえずRealm使いたいだけならこの手順は飛ばして良い
- build.gradle(Module:App)
dependenciesに下記を追加
compile "org.projectlombok:lombok:1.16.10"
- lombok.config
build.gradle (Prpoject) がある階層にlombok.configという名前のファイルを作成
内容は下記のとおり
lombok.addGeneratedAnnotation = false
※この設定ファイルが無いとAndroid環境ではビルドエラーが出る
モデル(テーブル)の作成
RealmObjectを継承したデータモデルクラスを作成
https://realm.io/docs/java/latest/#models
フィールドをprivateで定義する場合(getterとsetterにLombokを利用)
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class SampleObject extends RealmObject {
private int id;
private String name;
}
フィールドをpublicで定義する場合
public class SampleObject extends RealmObject {
public int id;
public String name;
}
アノテーションを付けた場合
public class SampleObject extends RealmObject {
@PrimaryKey
public int id;
@Required
public String name;
}
@Ignoreを付けると保存されない項目になる
@Indexを付けると検索インデックスが設定される
Realmの設定
設定とはDB実体のファイル名や暗号化の有無などなど
下記のコードはデフォルト設定を使う場合
Applicationクラスを継承したクラスのonCreate()に下記のコードを記載すると
アプリ全体で使えるので便利
import io.realm.Realm;
import io.realm.RealmConfiguration;
public class MyApplication extends Application {
public void onCreate() {
super.onCreate();
// Realm設定ここから
Realm.init(this);
RealmConfiguration config = new RealmConfiguration.Builder().build();
Realm.setDefaultConfiguration(config);
// Realm設定ここまで
}
~~~ 省略 ~~~
}
カスタム設定を使う方法
https://realm.io/docs/java/latest/#configuring-a-realm
Realmインスタンスの取得
デフォルト設定の場合
Realm realm = Realm.getDefaultInstance();
カスタム設定の場合はgetInstance(RealmConfiguration configuration)
を使うので注意
書き込み
書き込みは必ずトランザクションで囲む必要がある
createObjectの2個目のパラメータはモデルにPK(@PrimaryKey)を設定した場合にPKの値を指定する
PKを設定していない場合は指定しない
int id = 1;
Realm realm = Realm.getDefaultInstance();
realm.executeTransaction(new Realm.Transaction() {
@Override
public void execute(Realm realm) {
SampleObject obj = realm.createObject(SampleObject.class, id);
obj.name= 'test1';
}
});
取得(クエリ)
Realm realm = Realm.getDefaultInstance();
// SampleObjectの id=1 のデータを取得
SampleObject obj= realm.where(SampleObject.class).equalTo("id", 1).findFirst();
// SampleObjectの全レコード取得
RealmResults<SampleObject> objs = realm.where(SampleObject.class).findAll();
idを文字指定するところがいけてないけどサンプルをざっと見た感じわからなかった
Realm Field Names Helperを入れるとidの文字列指定を回避できます
zaki50さんありがとうございます