Android KotlinでRealmを使う

環境

資料

Realm公式 Realm: Create reactive mobile apps in a fraction of the time

Realmの導入

プロジェクトのbuild.gradleにrealmを追加

buildscript {
    ext.kotlin_version = '1.2.21'
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "io.realm:realm-gradle-plugin:5.0.0" //追加
    }
}

appのbuild.gradleにrealmを追加

ここはrealmを最後の行に書かないとエラーになるはず

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

apply plugin: 'realm-android' //追加

Realm初期設定

Realm.init

これはアプリ起動中に1回行うだけでいいので、カスタムアプリケーションクラスでやるのがオススメ

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Realm.init(this);
    }

AndroidManifestにカスタムアプリケーションを登録するのを忘れずに

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="ikemura.com.kotlinrealmmigration"
    >

    <application
+       android:name=".MyApplication" 
        android:allowBackup="true"

Realm使用

インスタンス

いよいよ画面でrealmを使えるようになった

    lateinit var realm: Realm

    private fun initRealm() {
        val realmConfiguration = RealmConfiguration.Builder()
                .deleteRealmIfMigrationNeeded()
                .schemaVersion(0)
                .build()
        realm = Realm.getInstance(realmConfiguration)
    }

Insert

Transaction化しないとIllegalStateExceptionが発生する

        realm.executeTransaction {
            realm.insert(Book(1,"first"))
        }

Read

titleが「first」と一致する値をbookに取得する

        var book = realm.where(Book::class.java)
                .equalTo("title","first")
                .findAll()
        Log.d(TAG,book.toString())

equalTo:カラム名, 値 の比較を行える findAll:クエリ条件を満たすすべてのオブジェクトを同期検索する

Delete

削除もTransaction化しないとIllegalStateExceptionが発生する

        //削除対象を取得
        var book = realm.where(Book::class.java)
                .equalTo("title","first")
                .findAll()
        //削除
        realm.executeTransaction {
            book.deleteAllFromRealm()
        }