【正社員】還元率83%【フリーランス】マージン一律5万円で案件をご紹介させていただきます。 詳細はこちら

【Android】<Kotlin>Realmを使ってデータを保存・編集・削除する方法を徹底解説!

【Android】<Kotlin>Realmを使ってデータを保存・編集・削除する方法を徹底解説!
すだ

みなさまこんにちは〜!
メモリアインクのすだです。

本日は、
KotlinでRealmを使用したデータの扱い方について
実際のコードを利用して徹底解説していきます!

この記事を読んでわかること…
・Realmとは?
・Realmの導入方法
・Realmを使用したデータの保存・編集・削除など

目次

環境

  • Kotlin (ver 1.9.0)
  • Android Studio (Giraffe | 2022.3.1 Patch 3)

Realmとは?

Realmは、モバイルアプリケーション向けのオブジェクトデータベース(SQLなどの操作が不要な、データをオブジェクトとして保存するデータベース)です。
SQLiteよりもシンプルにデータの永続化ができる点が特徴で、
Kotlinとの相性も良く、少ないコードで高速なデータベース操作が可能になります。

Realmを使用するメリット
  • シンプルなコードでデータのCRUD操作が可能
  • オブジェクト指向で設計できる (SQLを書かなくて良い)
  • パフォーマンスが高い (大量データの処理でも高速)
  • リアルタイムでデータが反映される (ライブオブジェクト)

Realmは高速・シンプルなデータ管理が得意ですが、
複雑なリレーションやバッチ処理が必要な場合にはSQLiteやRoomが向いています。
アプリの要件に応じて、最適なデータベースを選ぶことが重要です。

Realmの導入例

様々なシーンで利用できるRealmの機能は、Androidアプリを開発する上で非常に便利です。
たとえば、以下のような場面で使われています。

1. オフラインデータ保存 – ネットがなくても使えるアプリへ

Realmは、ネットワークが切れてもデータを保持できるため、オフラインでもスムーズに使えるアプリを作れます。
一時的にローカルへデータを保存し、接続が回復した際に同期する仕組みを構築するのに最適です。

活用例

  • メモ帳アプリ
  • タスク管理アプリ
  • オフラインECアプリ

2. ユーザーデータ管理 – 設定やプロフィールを保持

アプリを使うユーザーごとに、プロフィール情報やアプリの設定を保存するシーンでもRealmは活躍します。
アプリ内での状態を維持するのが簡単で、高速にアクセスできるのも魅力です。

活用例

  • ユーザープロフィールの保存
  • 通知設定・テーマ設定の保持
  • ログイン状態の管理

3. チャット・メッセージ機能 – リアルタイムでデータを反映

Realmのライブオブジェクトの仕組みは、リアルタイムでのデータ更新が必要なアプリに最適です。
メッセージのやりとりやチャット履歴を素早く保存・反映でき、スムーズなユーザー体験を提供できます。

活用例

  • チャットアプリ
  • SNSメッセージ機能
  • サポートチャットシステム

Realmの導入方法

それでは早速、プロジェクトにRealmを導入して 実際に使えるようにしてみましょう!
以下の三つの作業を行なってください。

Gradleに依存関係を追加

build.gradleのpluginsdependenciesに下記を追加します。

build.gradle(Module :app) ▼

plugins {
    id 'kotlin-kapt'
    id 'io.realm.kotlin'
}

dependencies {
    implementation "io.realm:realm-gradle-plugin:10.15.1"
}

Realmの初期化

Realmはアプリ起動時に初期化する必要があります。
Applicationクラスで初期化するのが一般的です。

class MyApp : Application() {
    override fun onCreate() {
        super.onCreate()
        Realm.init(this)
        val config = RealmConfiguration.Builder()
            .name("myrealm.realm")  // ファイル名を指定
            .schemaVersion(1)       // スキーマのバージョン
            .build()
        Realm.setDefaultConfiguration(config)
    }
}

4行目
Realm.init(this)で、初期化処理を行います。
これにより、Realmが内部的に使うリソースやデータベースファイルがアプリケーションに関連づけられます。

5〜8行目
RealmConfiguration.Builder()を使って、Realmの設定をカスタマイズします。

  • name("myrealm.realm")
    • データベースのファイル名を指定。デフォルトは「default.realm」。
  • schemaVersion(1)
    • データベースのスキーマのバージョンを指定。アプリをアップデートする際、スキーマの変更がある場合はこのバージョンを上げる。
  • build()
    • 設定をビルドし、RealmConfiguration オブジェクトを生成。

9行目
Realm.setDefaultConfiguration(config) Realm のデフォルト設定をアプリケーション全体に適用します。

モデルクラスの作成

Realmでは、データを保存するクラスはRealmObjectを継承します。

open class User(
    @PrimaryKey var id: String = "",
    var name: String = "",
    var age: Int = 0
) : RealmObject()

ポイント

  • @PrimaryKey を付与して、プライマリキーを設定できます。
  • デフォルト値を設定することで、エラーを防ぎましょう。

Realmを使ってデータのCRUD機能を実装する方法

Realmをプロジェクトに導入して、使用する準備が整ったら
早速CRUD機能を実現してみましょう!

Realm.getDefaultInstance()でRealmのデフォルト設定を呼び出し、データベースへの接続を開きます。

データの書き込み (Create)

Realmでは、データの書き込みは必ずトランザクション内で行う必要があります。
executeTransaction でトランザクションを開始し、そのブロック内の処理が完了すると自動的にコミットされます。

val realm = Realm.getDefaultInstance()
realm.executeTransaction { transactionRealm ->
    val user = transactionRealm.createObject(User::class.java, "1234")
    user.name = "Taro"
    user.age = 25
}
realm.close()

3行目
createObject は、Userというクラスのオブジェクトを作成し、Realmデータベースに登録します

  • "1234" は User の プライマリキー (主キー) 。
  • 同じプライマリキーでオブジェクトを作成しようとするとエラーになる
  • これにより、id = "1234" のユーザーがRealmに作成される。

4〜5行目

作成した user オブジェクトに対して、name と age フィールドに値をセットします。

  • User クラスは事前に RealmObject を継承して、データモデルとして定義されている必要がある。

7行目

realm.close() で、Realmデータベースへの接続を終了します。
Realm はデータベースへの接続を持続するため、使い終わったら必ず close する必要があり、
クローズしないとメモリリークやパフォーマンスの問題が発生する可能性があります。

そうすると、データは以下のように保存されます。

idnameage
1234Taro25

データの読み込み (Read)

val realm = Realm.getDefaultInstance()
val users = realm.where(User::class.java)
    .equalTo("name", "Taro")
    .findAll()
users.forEach { user ->
    Log.d("Realm", "User: ${user.name}, Age: ${user.age}")
}
realm.close()

3〜5行目

where でクエリを開始し、equalTo で条件を指定、findAll で結果を取得します。
(取得したデータ は List のように扱えるので、forEach などが使えます。)
該当するデータがない場合は空のリストが返されます。

データの更新 (Update)

Realmでは読み取ったオブジェクトをそのまま更新可能です。

realm.executeTransaction { transactionRealm ->
    val user = transactionRealm.where(User::class.java)
        .equalTo("id", "1234")
        .findFirst()
    user?.let {
        it.age = 30  // 年齢を更新
    }
}

6行目

it.age = 30 で、検索で見つかったユーザーの age フィールドを 30 に更新します。
直接フィールドを書き換えるだけでデータが更新されます。

データの削除 (Delete)

realm.executeTransaction { transactionRealm ->
    val user = transactionRealm.where(User::class.java)
        .equalTo("id", "1234")
        .findFirst()
    user?.deleteFromRealm()
}

5行目

deleteFromRealmを使用して、オブジェクトを直接削除します。
条件を満たすデータをすべて削除したい場合はdeleteAllFromRealmを使用します。

応用: 非同期処理 (Async)

Realmは非同期処理も簡単に行えます。

realm.executeTransactionAsync({ transactionRealm ->
    val user = transactionRealm.createObject(User::class.java, "5678")
    user.name = "Jiro"
    user.age = 20
}, {
    Log.d("Realm", "データの作成に成功しました")
}, { error ->
    Log.e("Realm", "データの作成に失敗しました: ${error.message}")
})

成功時、失敗時のコールバックを追加して処理の分岐ができます。

まとめ

おつかれさまでした。いかがでしたでしょうか!

Kotlinアプリ開発でデータベースが必要な場合は、ぜひRealmを試してみてください。

すだ

技術者としてのキャリアパスを次のレベルへと進めたい皆様、
未経験からIT・Webエンジニアを目指すなら【ユニゾンキャリア】
を通じて、
自分の市場価値をさらに向上させてみませんか?

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

弊社テックブログをご愛読いただきありがとうございます。
当テックブログを運用している株式会社メモリアインクは、
【正社員】還元率83%
【フリーランス】マージン一律5万円で案件のご紹介
と、エンジニアの皆様に分かりやすい形で稼げる仕組みを構築し提供させていただいております。詳しくは弊社お問い合わせページ、プロフィールのQRコードを読み取り、LINEメッセージでお問い合わせいただけますと幸いです。

コメント

コメントする

目次