#はじめに
サーバーと通信しないちょっとしたアプリを作るとき、ほぼ必要になるのがデータベースです。(通信するときでも使うけど)
今まではお手軽に使えるSQliteとかいう簡易的なものが使われてきました。
が、いい加減古いんじゃね?ってことで最近Realmというデータベースが使われはじめてます。(たぶん)
#Realmって?
一言で書くとSQliteのような端末内で動くDBです。
SQliteの代替として使う事を目的に作られました。
じゃあ別にSQliteでええやん
って思うかもしれません。が、SQliteよりもメリットが多いのです。
前々からあるけど4.3でkotlin正式対応したので使ってみることに。
#使うメリットって?
###メリット1:速い
とにかくメリットはこれに集約されます。速い。sqliteの数倍の速度はあるみたい。(詳しくは調べてみてください)
###メリット2:構造がシンプル
これが個人的に一番なのですが、メソッドに引数を渡すだけで保存出来るのはシンプルで使いやすいかと。
端末内に保存するときってちょっとしたデータであるケースが殆どだと思うので・・・!
unityのplayerprefみたいにお手軽に使える・・・!
###メリット3:iOS/Android両対応
両プラットフォーム共通で使えるのは学習コスト的にいいなと。
特にkotlinの場合、swiftと似ているので本当に親和性が高くて便利です。
変に書き方を変え無くてもいい。
#実際に使ってみると?
ということで能書きはいいので使用方法を。
###appのbuildgradleにpathを追加する
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'
###projectのbuildgradleにも追加
classpath "io.realm:realm-gradle-plugin:5.0.0"
*一応最新版プラグインを確認しておくことをおすすめします
###Applicationを継承したクラスを作って初期化
アプリ起動したらonCreateで有効化しちゃいます。
Applicationを継承したクラスの頭でinitしておくとどこからも使えて便利。
class SampleApp: Application() {
override fun onCreate() {
super.onCreate()
//Realmの初期化
Realm.init(this)
val config = RealmConfiguration.Builder().build()
Realm.setDefaultConfiguration(config)
}
}
###RealmObjectを継承したクラスを作ってテーブルとかの設定する
当然DBの情報設定が必要になります。ので設定する。
kotlinの場合、型推論で定義すると後からめんどくさい事になる可能性あり・・・
ちなみにアノテーションいらないのですが、超わかりにくくなるので書くこと推奨。
ここのクラスをopen属性にしないと継承、オーバーライドできないので注意
open class SampleObj: RealmObject() {
@PrimaryKey
var id : Int? = null
@Required
var name = ""
}
これで準備は整いました。次は実際に使用する方法
###書き込んでみる
RealmObjectで設定した情報をキーに書き込みます。
書き込む時は必ずトランザクションする必要があります。
class Example : Activity() {
override fun onCreate() {
super.onCreate()
//keyを設定して
val id = 1
//initしたインスタンスをとってきて、トランザクションで書き込み
realm = Realm.getDefaultInstance()
realm.executeTransaction { realm ->
val obj = realm.createObject(SampleObj::class.java!!, id)
obj.name = "test"
}
}
}
これでidが1のレコードのnameにtestと書き込む事が出来ました。
###読み出してみる
読み出しはメソッドを使ってやります。
findAllだとオブジェクトのレコード全件。
findFirstだと一致するレコードをとってきます。
class Example : Activity() {
override fun onCreate() {
super.onCreate()
realm = Realm.getDefaultInstance()
//idが1のレコードをとってくる
val id1 = realm.where(SampleObj::class.java).equalTo("id", "1").findFirst()
//全件取得
val all = realm.where(SampleObject::class.java).findAll()
}
}
最後にはオブジェクトをdestroyしておきましょう
class Example : Activity() {
override fun onDestroy() {
super.onDestroy()
realm.close()
}
}
#おわりに
ざっとですがこんな感じで使えます。メリットはとにかく早いと言う点がありますが、そもそもシングルビューなアプリだったらそんなに体感出来ないような気がしないこともない。
簡単に使えるのでとりあえず使ってみて考えよう・・・