LoginSignup
27
15

More than 3 years have passed since last update.

Realmの基本的な使い方まとめ in Kotlin

Last updated at Posted at 2020-06-29

1.概要

RealmはSQLiteに代わる軽量、高速データベースでアプリ開発にも利用できます。
そのRealmが7.0.0になりKotlinの正式ドキュメントも公開されました!
せっかくなのでAndroidアプリでの簡単な使い方をまとめます。
7.0.0はbeta版で、安定板は6.0.2になります。お好みでどうぞ!

■URL
【公式】Kotlinドキュメント
https://realm.io/docs/kotlin/latest/
【公式】Javaドキュメント
https://realm.io/docs/java/latest/
自作サンプル(INSERT,SELECT,DELETEしているだけ)
https://github.com/KIRIN3git/RealmTest

2.事前準備

build.gradleは7.0.0と6.0.2で設定が違います。

build.gradle【7.0.0】
buildscript {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'
        }
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:7.0.0-beta-SNAPSHOT"
    }
}

allprojects {
    repositories {
        jcenter()
        google()
        maven {
            url 'http://oss.jfrog.org/artifactory/oss-snapshot-local'
        }
    }
}
build.gradle【6.0.2】
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath "io.realm:realm-gradle-plugin:6.0.2"
    }
}
[app]build.gradle
apply plugin: 'com.android.application'
apply plugin: 'kotlin-kapt'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'
apply plugin: 'realm-android'

(注意)kotlinプラグインの後にrealm-androidでないとダメ

3. 初期化と設定

初期化と設定を行います。
初期化の場所はどこでもOKですが、最初に呼び出せば良いのでApplicationクラスがオススメだそうです。

設定はDBを分けたり、拡張したり、永続化せずインメモリにしたり、リードオンリーにしたりするのに利用するそうです。
設定しなくても動きます。
・参考
RealmConfiguration

MainApplication.kt
class MainApplication : Application() {
    override fun onCreate() {
        super.onCreate()

        // 初期化
        Realm.init(this)

        // 設定
        val config = RealmConfiguration.Builder()
            .name("myrealm.realm")
            .encryptionKey(getMyKey())
            .schemaVersion(42)
            .modules(MySchemaModule())
            .migration(MyMigration())
            .readOnly()
            .inMemory()
            .build()
        Realm.setDefaultConfiguration(config)
    }
}

4. モデルクラスの作り方

データをinsertしたりselectするためのデータの型を作成

  • 手順
    • RealmObjectを継承(必須)
    • openに設定(必須)
    • 必要に応じてアノテーションを設定

プライマリーキー​を設定するとcopyToRealmOrUpdateまたはinsertOrUpdateを使用できます。

Person.kt
open class Person(
    @PrimaryKey var id: Long = 0,
    var name: String = "",
    var age: Int = 0
) : RealmObject()

5. 登録方法(INSERT)

  • 手順
    • インスタンスを作成
    • トランザクションでラップ
    • insert
    • インスタンスを閉じる

インスタンスはアクティビティ内などで使いまわしても良いです。
そしてインスタンスは必ず閉じましょう!
トランザクションの方法は色々あります。
非同期で使いたい場合はexecuteTransactionAsync

RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

val personData = Person(1,Taro,15)

realm.beginTransaction()
realm.insert(personData)
realm.commitTransaction()

// インスタンスを閉じる
realm.close()

6. 取得方法(SELECT)

  • 手順

    • インスタンスを作成
    • データの取得
    • 絞り込み
    • メモリ外にコピー
    • インスタンスを閉じる
  • 主な取得関数

    • findAll:クエリ条件を満たすすべてのオブジェクトを検索します
    • findAllAsync:バックグラウンドスレッドで非同期に動作します
    • findFirst(またはfindFirstAsync):クエリ条件を満たす最初のオブジェクトを見つける

その他関数はこちら(Javaだけど・・・)
https://realm.io/docs/java/3.5.0/api/io/realm/RealmQuery.html

利用方法はこちらを参照
https://realm.io/docs/kotlin/latest/#queries

RxJavaも利用できる!(試してはいない・・・)
https://realm.io/docs/kotlin/latest/#rxjava

(注意) realmオブジェクトはRealmインスタンスをクローズすると消えてしまう。kotlinオブジェクトとして使いたい場合はcopyFromRealmを使用!

RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

// 全取得
val users = realm.where<Person>().findAll()
// 絞り込み
users.equalTo("name", "John”)
// メモリ外にコピー
val user = realm.copyFromRealm(users[0])

// インスタンスを閉じる
realm.close()

7. 削除方法(DELETE)

  • 手順
    • インスタンスを作成
    • トランザクションでラップ
    • delete
    • インスタンスを閉じる
RealmSql.kt
// インスタンス作成
var realm = Realm.getDefaultInstance()

realm.beginTransaction()
// 削除
persons.deleteAllFromRealm()
realm.commitTransaction()

// インスタンスを閉じる
realm.close()
27
15
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
27
15