みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
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のpluginsとdependenciesに下記を追加します。
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 する必要があり、
クローズしないとメモリリークやパフォーマンスの問題が発生する可能性があります。
そうすると、データは以下のように保存されます。
| id | name | age | 
|---|---|---|
| 1234 | Taro | 25 | 
データの読み込み (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エンジニアを目指すなら【ユニゾンキャリア】![]()
![]()
自分の市場価値をさらに向上させてみませんか?


			







コメント