【Kotlin】Realm Java SDKを試してみた

先日、RealmのKotlin SDKを試してみた記事を投稿した。

【Kotlin】Realmをインストールして試してみた

Kotlin SDKはシンプルな書き方でとても良いのだが、1つ欠点を発見し悩むことになる。

You cannot store Kotlin's built-in Date or Instant types in Realm Database.

そう、Date型が使えないのだ。

アップデートされれば使えるようになるかもしれないが、少なくとも現時点では使えない。

そこで詳しく調べてみると、Kotlin SDKとは別にJava SDKが存在することが分かった。

参考書やネットの情報だと、Java SDKの話をしていることが多く、むしろこっちが主流だったのね。

Java SDKと書かれているがKotlin対応もしているため、現時点では情報が多いJavaSDKを使った方がメリットは多いと思う。

インストール

プロジェクトレベルのGradleに以下を追記する。

// 追加
buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:10.11.0"
    }
}
// ここまで
plugins {
:
}

アプリレベルのGradleに以下を追記する。

plugins {
    id 'com.android.application'
    id 'org.jetbrains.kotlin.android'
    id 'org.jetbrains.kotlin.kapt' // 追加
}

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

Syncして完了。

https://www.mongodb.com/docs/realm/sdk/java/install/#std-label-java-install

クラスの作成

オブジェクト用のクラスを作成する。

open class Memo :RealmObject(){
    @PrimaryKey var id:Long = 0
    var dateTime: Date = Date()
    var lat: Double = 0.0
    var lng: Double = 0.0
    var memo: String = ""
}

初期設定

コンフィグを設定する。

class RealmSetting:Application() {
    //MainActivityよりも先に呼ばれる!!
    override fun onCreate() {
        super.onCreate()

        Realm.init(this)

        val configuration = RealmConfiguration.Builder()
            .deleteRealmIfMigrationNeeded()
            .allowWritesOnUiThread(true)
            .build()

        Realm.setDefaultConfiguration(configuration)
    }
}

deleteRealmIfMigrationNeededは、クラス(DBのカラム)を変更したときに、DBの中身を削除する。

これを設定しておかないと、クラスを変更したときに、実行時エラーが発生してアプリが終了する。

allowWriteOnUIThreadは、UIスレッドで書き込みを許可する設定である。

別スレッド推奨なのだろうけど、今回はUIスレッドで書き込みをする。

マニフェストに登録しておくことで、アプリ起動時に実行される。

<uses-permission android:name="android.permission.SCHEDULE_EXACT_ALARM" />
<application
    android:name=".RealmSetting"
    android:allowBackup="true"

書き込み

executeTransactionで書き込みをする。

    private lateinit var realm: Realm

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

        realm = Realm.getDefaultInstance()

        val lat = intent.getDoubleExtra("lat",0.0)
        val lng = intent.getDoubleExtra("lng",0.0)

        save_btn.setOnClickListener {
            val memoStr = memoEdit.text.toString()

            realm.executeTransaction {
                val maxId = realm.where<Memo>().max("id")
                val nextId = (maxId?.toLong() ?: 0L) + 1L
                var memo = realm.createObject<Memo>(nextId)
                memo.memo = memoStr
                memo.lat = lat
                memo.lng = lng
                memo.dateTime = Date()
                it.insert(memo)
            }
            Toast.makeText(this,"登録完了しました",Toast.LENGTH_SHORT).show()
            finish()
        }

検索

whereのfindAllを使って全検索をする。

    private fun queryAll(){
        val memos = realm.where<Memo>().findAll()

        for (i in memos){
            Log.v("hoge", i.memo)
            Log.v("hoge", i.dateTime.toString())
        }
    }

クローズ

使い終わったらクローズする。

    override fun onDestroy() {
        super.onDestroy()
        realm.close()
    }

ABOUTこの記事をかいた人

個人アプリ開発者。Python、Swift、Unityのことを発信します。月間2.5万PVブログ運営。 Twitter:@yamagablog