26
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

KotlinでRealmを使ってみた

Last updated at Posted at 2018-03-18

#はじめに

サーバーと通信しないちょっとしたアプリを作るとき、ほぼ必要になるのがデータベースです。(通信するときでも使うけど)
今まではお手軽に使えるSQliteとかいう簡易的なものが使われてきました。
が、いい加減古いんじゃね?ってことで最近Realmというデータベースが使われはじめてます。(たぶん)

#Realmって?
一言で書くとSQliteのような端末内で動くDBです。
SQliteの代替として使う事を目的に作られました。

じゃあ別にSQliteでええやん

って思うかもしれません。が、SQliteよりもメリットが多いのです。
前々からあるけど4.3でkotlin正式対応したので使ってみることに。

#使うメリットって?

###メリット1:速い

とにかくメリットはこれに集約されます。速い。sqliteの数倍の速度はあるみたい。(詳しくは調べてみてください)

###メリット2:構造がシンプル

これが個人的に一番なのですが、メソッドに引数を渡すだけで保存出来るのはシンプルで使いやすいかと。
端末内に保存するときってちょっとしたデータであるケースが殆どだと思うので・・・!
unityのplayerprefみたいにお手軽に使える・・・!

###メリット3:iOS/Android両対応

両プラットフォーム共通で使えるのは学習コスト的にいいなと。
特にkotlinの場合、swiftと似ているので本当に親和性が高くて便利です。
変に書き方を変え無くてもいい。

#実際に使ってみると?

ということで能書きはいいので使用方法を。

###appのbuildgradleにpathを追加する

build.gradle
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: 'realm-android'

###projectのbuildgradleにも追加

build.gradle
classpath "io.realm:realm-gradle-plugin:5.0.0"

*一応最新版プラグインを確認しておくことをおすすめします

###Applicationを継承したクラスを作って初期化

アプリ起動したらonCreateで有効化しちゃいます。
Applicationを継承したクラスの頭でinitしておくとどこからも使えて便利。

SampleApp
class SampleApp: Application() {

    override fun onCreate() {
        super.onCreate()

        //Realmの初期化
        Realm.init(this)
        val config = RealmConfiguration.Builder().build()
        Realm.setDefaultConfiguration(config)
    }

}

###RealmObjectを継承したクラスを作ってテーブルとかの設定する

当然DBの情報設定が必要になります。ので設定する。
kotlinの場合、型推論で定義すると後からめんどくさい事になる可能性あり・・・
ちなみにアノテーションいらないのですが、超わかりにくくなるので書くこと推奨。
ここのクラスをopen属性にしないと継承、オーバーライドできないので注意

SampleObj
open class SampleObj: RealmObject() {

    @PrimaryKey
    var id : Int? = null
    @Required
    var name = ""

}

これで準備は整いました。次は実際に使用する方法

###書き込んでみる

RealmObjectで設定した情報をキーに書き込みます。
書き込む時は必ずトランザクションする必要があります。

Example.kt

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だと一致するレコードをとってきます。

Example.kt

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しておきましょう

Example.kt

class Example : Activity() {

    override fun onDestroy() {
        super.onDestroy()

        realm.close()
    }

}

#おわりに

ざっとですがこんな感じで使えます。メリットはとにかく早いと言う点がありますが、そもそもシングルビューなアプリだったらそんなに体感出来ないような気がしないこともない。
簡単に使えるのでとりあえず使ってみて考えよう・・・

26
30
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
30

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?