【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 now
で Gradle
を同期します。
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
を開くと下記のようにデータが保存されていることが確認できました✨
参考
- https://realm.io/docs/kotlin/latest/#getting-started
- https://realm.io/jp/docs/java/latest/#%E3%83%9E%E3%82%A4%E3%82%B0%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3
- https://qiita.com/kumas/items/c98f1006776ad141d5f7
- https://techikoma.com/index.php/2019/09/06/realm-studio-check/