先日、RealmのKotlin SDKを試してみた記事を投稿した。
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() }