
Kotlinで始めるAndroidアプリ開発記録#3~Roomによるデータの永続化~
Androidアプリ開発において、データの永続化は欠かせない要素の一つです。その中でも、SQLiteを簡単かつ安全に扱える仕組みとしてRoomが提供されています。今回、KotlinでRoomを使って実装した感想をまとめます。
Roomを使ってみる
Android OSには、あらかじめSQLiteというデータベースが組み込まれています。Roomは、このSQLiteデータベースをAndroidアプリで簡単に扱えるようにするためのデータ永続化ライブラリです。Googleが提供しているAndroid Jetpackの一部で、SQLiteをラップし、型安全なデータベース操作を実現します。
Roomには次のような特徴があります。
SQLiteを簡単に扱える
SQLの記述が必要な場面を減らし、Kotlinのコードでデータ操作が可能
型安全
SQLの構文エラーをコンパイル時に検出できる
LiveDataやFlowと連携
データの変更をリアルタイムでUIに反映可能
非同期処理が簡単
suspend関数やRxJavaを利用できる
マイグレーションのサポート
データベースのバージョン管理が可能
Roomは、3つの主要コンポーネントで構成されます。
エンティティ(Entity)
// SQLiteのテーブルに対応するデータクラス
@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true) val id: Int = 0,
@ColumnInfo(name = "name") val name: String,
@ColumnInfo(name = "age") val age: Int
)
DAO(Data Access Object)
// データベースへのアクセスを定義するインターフェース
@Dao
interface UserDao {
@Insert
suspend fun insert(user: User)
@Query("SELECT * FROM users")
fun getUsers(): List<User>
@Query("SELECT name FROM users WHERE id = :id")
fun getName(id: Int): String
@Query("SELECT age FROM users WHERE id = :id")
fun getAge(id: Int): Int
@Delete
suspend fun delete(user: User)
}
データベース(Database)
// データベースの定義とインスタンス取得を管理するクラス
@Database(entities = [User::class], version = 1)
abstract class UserDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
Roomを使うには、KSP(Kotlin Symbol Processing)の依存関係を追加する必要があります。
// [build.gradle.kts(Project)]
plugins {
...
// Kotlinのバージョンに合わせる
id("com.google.devtools.ksp") version "1.9.20-1.0.14" apply false
}
// [build.gradle.kts(Module)]
plugins {
...
id("com.google.devtools.ksp")
}
dependencies {
...
val room_version = "2.6.1"
implementation("androidx.room:room-runtime:$room_version")
implementation("androidx.room:room-ktx:$room_version")
ksp("androidx.room:room-compiler:$room_version")
}
ここで注意すべき点は、自身の環境で使用しているKotlinのバージョンに合わせてKSPのバージョンを指定することです。最初これが分からず、随分ハマりました。。
Roomの導入でつまずいてしまいましたが、実際にコーディングして使ってみると、非常に簡単かつ直感的にデータベースが操作できます。
感想
SQLをガッツリ書いていた自分にとって、Roomの使い勝手は目から鱗で、「直接SQLを書く機会が減り、Kotlinの型安全性を活かせる点」が大きなメリットだと感じました。特に、DAOインターフェースで@Queryを使うことで、SQLを書きつつも、コンパイル時にチェックしてくれるため、実行時エラーが発生しにくいのは安心感があります。
KotlinでRoomを使ってみて、データベース操作が非常に簡潔になり、可読性も向上したと感じました。特に、型安全性、コルーチンとの相性、リアクティブなデータ操作など、Androidアプリ開発に適した仕組みが整っていると実感しました。一方で、マイグレーションやパフォーマンス面での考慮が必要な場面もありましたが、全体的には扱いやすく、今後の開発でも積極的に活用していきたいと思います。
ここまでお読みいただき、ありがとうございました。それではまた!