iOSエンジニアのつぶやき

毎朝8:30に iOS 関連の技術について1つぶやいています。まれに釣りについてつぶやく可能性があります。

【Kotlin】Android Realm でデータを保存して確認するまで

今回は、Kotlin を使って Realm にデータを保存。そして、Realm Studio で保存したデータ確認するまでの手順を紹介したいと思います👷‍♀️

それではやっていく

1.プロジェクトレベルの Gradle に下記を追加します。執筆時点では、10.0.1 が最新版でしたがアップデートされる可能性もあるので、適所書き換えてください。 ref: Realm: Create reactive mobile apps in a fraction of the time

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:10.0.1"
    }
}

2.アプリレベルの Gradleプラグインを追加します。プラグインを記述する順序は下記のように書く必要があるそうです。

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'

3.Sync nowGradle を同期します。

4.次にカスタムアプリケーションクラスで Realm の初期化コードを記述します。

package io.realm.examples.kotlin

import android.app.Application

import io.realm.Realm

class MyApplication : Application() {

    override fun onCreate() {
        super.onCreate()
        // Initialize Realm. Should only be done once when the application starts.
        Realm.init(this)
    }
}

カスタムアプリケーションクラスを適用するには、AndroidManifest.xml<application> タグ内に android:name 属性を追加し、値に先ほど作成したアプリケーションクラスを指定します。一部のみ抜粋していますが下記がサンプルです。

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

    <application
        android:name=".MyApplication"

また、Scheme version を指定する場合やマイグレーションを記述する際には、RealmConfiguration を指定してそれらを設定します。下記がマイグレーションを指定した場合の Realm の初期化コードになります。 この他にも指定できるメソッドがあるので詳しくは下記を参照してください。

RealmConfiguration.Builder (Realm 10.0.1)

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this)
        val config = RealmConfiguration.Builder()
            .schemaVersion(0)
            .migration(Migration())
            .build()
        Realm.setDefaultConfiguration(config)
    }
}

class Migration : RealmMigration {
    override fun migrate(realm: DynamicRealm, oldVersion: Long, newVersion: Long) {
        var oldVersion = oldVersion

        // scheme version 1 へのマイグレ
        if (oldVersion == 0L) {
            // TODO: Add migration code.
            oldVersion++
        }
        
        // scheme version 2 へのマイグレ
        if (oldVersion == 1L) {
            // TODO: Add migration code.
            oldVersion++
        }
    }
}

5.保存するモデルを作成

open class で作成したクラスを RealmObject() のサブクラスとして使用します。下記の例では documentId@PrimaryKey アノテーションを付与することで、RealmPlace モデルの主キーとして documentId を指定しています。

open class RealmPlace(
    @PrimaryKey
    var documentId: String = "",

    var name: String = "",
    var countryName: String = "",
    var imagePath: String = "",
    var description: String? = null

): RealmObject()

アノテーションについては下記をご覧ください。

@PrimaryKey

フィールドをモデルの主キーとしてマークする。主キーとして扱える型は String もしくは Int(byte, short, int, long, Byte, Short, Integer, Long) 値。 このアノテーションを付けるとフィールドには自動的にインデックスが付けられる。つまり、@Index アノテーションを暗黙的に付与している。

@Required

フィールドの null を許容しない。プリミティブ型と RealmList は暗黙的に @Required が付与される。

@Index

フィールドをインデックスとしてマークする。String, Byte, Short, Int, Long, Boolean and Date などが使用可能。

@Ignore

フィールドを保存させたくない場合に付与する。

6.データを保存します。

今回は Activity 内でデータを保存しました。RealmインスタンスRealm.getDefaultInstance() で取得することができます。

class DetailsActivity : AppCompatActivity() {

    private lateinit var item: PlaceItemEntity
    private lateinit var realm: Realm

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_details)

        realm = Realm.getDefaultInstance()

        val state = intent.getSerializableExtra("hoge")
        if(state is PlaceItemEntity){
            item = state
            createOrUpdate()
        }
    }

    private fun createOrUpdate() {
        val place = RealmPlace(item.documentId, item.name, item.countryName, item.imagePath, null)
        realm.beginTransaction()
        realm.copyToRealmOrUpdate(place)
        realm.commitTransaction()
    }
}

7.最後に Realm Studio を使用して、保存したデータの中身を確認してみます。

プロジェクトのルートで下記コマンドを実行していくことで、ディレクトリのルートに defaut.realm ファイルが作成されます。com.YamatoOtaka.androidsample1 の部分はそれぞれのパッケージ名に書き換えてください。

$ adb shell
$ run-as com.YamatoOtaka.androidsample1
$ cp files/default.realm /sdcard/default.realm
$ exit
$ exit
$ adb pull /sdcard/default.realm

作成された default.realm を開くと下記のようにデータが保存されていることが確認できました✨

f:id:yum_fishing:20201212150237p:plain

参考

その他の記事

yamato8010.hatenablog.com

yamato8010.hatenablog.com

yamato8010.hatenablog.com