見出し画像

Kotlinで始めるAndroidアプリ開発記録#3~Roomによるデータの永続化~

Androidアプリ開発において、データの永続化は欠かせない要素の一つです。その中でも、SQLiteを簡単かつ安全に扱える仕組みとしてRoomが提供されています。今回、KotlinでRoomを使って実装した感想をまとめます。


Roomを使ってみる

Android OSには、あらかじめSQLiteというデータベースが組み込まれています。Roomは、このSQLiteデータベースをAndroidアプリで簡単に扱えるようにするためのデータ永続化ライブラリです。Googleが提供しているAndroid Jetpackの一部で、SQLiteをラップし、型安全なデータベース操作を実現します。

Roomには次のような特徴があります。

  1. SQLiteを簡単に扱える

    • SQLの記述が必要な場面を減らし、Kotlinのコードでデータ操作が可能

  2. 型安全

    • SQLの構文エラーをコンパイル時に検出できる

  3. LiveDataやFlowと連携

    • データの変更をリアルタイムでUIに反映可能

  4. 非同期処理が簡単

    • suspend関数やRxJavaを利用できる

  5. マイグレーションのサポート

    • データベースのバージョン管理が可能

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アプリ開発に適した仕組みが整っていると実感しました。一方で、マイグレーションやパフォーマンス面での考慮が必要な場面もありましたが、全体的には扱いやすく、今後の開発でも積極的に活用していきたいと思います。


ここまでお読みいただき、ありがとうございました。それではまた!

いいなと思ったら応援しよう!