Help us understand the problem. What is going on with this article?

【初学者向け】AndroidでRealmを実装する

More than 1 year has passed since last update.

はじめに

Realmの公式ドキュメントを更に実装しやすくするための記事です。

準備

Projectのbuild.gradleに下記を加えます。

dependencies {
        classpath "io.realm:realm-gradle-plugin:3.5.0"
}

下記のようになればOKです。

build.gradle
buildscript {
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.1.4'
        classpath "io.realm:realm-gradle-plugin:3.5.0"
    }
}

...

次にAppのbuild.gradleに下記を加えます。

apply plugin: 'realm-android'

下記のようになればOKです。

build.gradle
apply plugin: 'com.android.application'
apply plugin: 'realm-android'

android {
    compileSdkVersion 28
    defaultConfig {
        applicationId "***"
        minSdkVersion 21
        targetSdkVersion 28

...

また、アプリの起動時にRealmを初期化する必要があります。
今回はMainActivityが最初のページなので、onCreateに初期化処理Realm.init()を書きます。
また、RealmのインスタンスはRealm.getDefaultInstance()で指定します。
以下のようになればOKです。

MainActivity.java
...

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

    Realm.init(this);

    Realm realm = Realm.getDefaultInstance();
}

...

保存するモデルを作る

Realmにはモデル単位でデータを保存していきます。
RealmObjectを継承したモデルを作成しましょう。

SampleModel.java
import io.realm.RealmObject;

public class SampleModel extends RealmObject {
    private String name;
    private int age;

    public String getName() {
        return this.name;
    }

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

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

ここからはこのモデルを使っていきます。

データを新規保存する

保存処理を記述する時は.beginTransaction(),.commitTransaction()の間に記述します。
また、新規保存時はRealm経由でモデルをインスタンス化します。

Name Age
GODIVA 21

例えば下記のようなデータを保存する場合は以下のようになります。

MainActivity.java
...

realm.beginTransaction();
SampleModel model=realm.createObject(SampleModel.class);
model.setName("GODIVA");
model.setAge(21);
realm.commitTransaction();

...

データを全て読み込む

読み込みたいデータモデルを指定して読み込みます。
RealmQueryで読み込むデータモデルの情報を持ち、RealmResultsで実際にデータを取得します。
保存されてるデータを全て読み込む場合は以下のようになります。

MainActivity.java
...

RealmQuery<SampleModel> query = realm.where(SampleModel.class);
RealmResults<SampleModel> result = query.findAll();

for (int i=0;i<result.size();i++){
    System.out.println(result.get(i).getName());
    System.out.println(result.get(i).getAge());
}

...

現在は上記のデータしか保存されていないため、以下のような出力になります。

Logcat
->

I/System.out: 
GODIVA
21

特定のデータのみ読み込む

データが一つでは検索の意味がないため、加えて複数のデータを保存しておきます。
GODIVAとIEKEIは同い年にします。

Name Age
GODIVA 21
IEKEI 21
NATTO 64
MainActivity.java
...

realm.beginTransaction();

SampleModel model=realm.createObject(SampleModel.class);
model.setName("GODIVA");
model.setAge(21);

SampleModel model2=realm.createObject(SampleModel.class);
model2.setName("IEKEI");
model2.setAge(21);

SampleModel model3=realm.createObject(SampleModel.class);
model3.setName("NATTO");
model3.setAge(64);

realm.commitTransaction();

...

先程と同じようにRealmQueryを作成します。
作成したRealmQueryに検索の情報を付加することで特定のデータのみ取得します。
age = 21のデータのみ取得する場合は、以下のようにします。

MainActivity.java
...

RealmQuery<SampleModel> query = realm.where(SampleModel.class);
query.equalTo("age",21);
RealmResults<SampleModel> result = query.findAll();

for (int i=0;i<result.size();i++){
    System.out.println(result.get(i).getName());
    System.out.println(result.get(i).getAge());
}

...
->

I/System.out:
GODIVA
21
IEKEI
21

データを上書き保存する

既に保存されてるデータを上書きしたい場合は、まず上書きするデータを取得します。
データの更新を行うので、保存時と同様に.beginTransaction(),.commitTransaction()の間に記述します。
下記のコードではname = GODIVAで検索して出てきた一人目のageを100歳に上書きしています。

MainActivity.java
...

RealmQuery<SampleModel> query = realm.where(SampleModel.class);
query.equalTo("name","GODIVA");
RealmResults<SampleModel> result = query.findAll();

realm.beginTransaction();
result.get(0).setAge(100);
realm.commitTransaction();        

...

再度データを取得すると確認できます。

->

I/System.out:
GODIVA
100

age = 21の全員のnameを「ラーメン」にする場合は以下のようにします。

MainActivity.java
...

RealmQuery<SampleModel> query = realm.where(SampleModel.class);
query.equalTo("age",21);
RealmResults<SampleModel> result = query.findAll();

realm.beginTransaction();
for (int i=0;i<result.size();i++){
    result.get(i).setName("ラーメン");
}
realm.commitTransaction();        

...

全員ラーメンになりましたか?

->

I/System.out:
ラーメン
21
ラーメン
21
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした