みなさまこんにちは〜!
メモリアインクのすだです。
本日は、
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エンジニアを目指すなら【ユニゾンキャリア】
自分の市場価値をさらに向上させてみませんか?
コメント