はじめに
こんにちは、趣味でAndoridアプリ開発をしているのですが、Roomライブラリについて基本的な使い方をまとめていきます。
前提知識
- Androidでローカルデータベースを使いたいときは、SQLiteを使用することが多い。
- しかし、直接使うとなるとSQKクエリを全て実装したり、クエリ結果を手動でKotlin/Javaのデータオブジェクトに変換する必要がある
- そこで、Roomを使うと面倒なことから解放してくれる
Roomとは
- ローカルデータベースを構築するライブラリ
- SQLiteの抽象化レイヤーを提供する
- 自動的にKotlinのdata classなどのオブジェクトに変換してくれる
主要コンポーネント
- データベース クラス: データベース
- データ エンティティ: データベースのテーブル
- データアクセス オブジェクト(DAO): クエリ(select, insertなど)が使用できる
使い方
Gradleの設定
gradle/libs.versions.toml にRoomプラグインを追加する
[versions]
room = "2.6.1" # 最新の安定版に更新推奨
ksp = "1.9.22-1.0.17" # Kotlinバージョンに合わせたKSPバージョン
[libraries]
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
room-ktx = { module = "androidx.room:room-ktx", version.ref = "room" }
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }
[plugins]
# Room固有のプラグインは不要。代わりにKSPを使用
google-devtools-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" }
プロジェクトのルートにあるbuild.gradle.ktsにエイリアスを追加
plugins {
// ... 他のプラグイン ...
alias(libs.plugins.room) apply false // <-- これを追加
}
モジュールレベルの build.gradle.kts (app の方) でプラグインを適用
plugins {
// 既存のプラグイン
// ...
// KSPプラグインの適用
alias(libs.plugins.google.devtools.ksp)
}
dependencies {
// ...
// Room Compiler は KSP プロセッサとして指定(ksp スコープ)
ksp(libs.room.compiler) // libs.androidx.room.compiler などlibs.versions.tomlの定義に合わせる
}
使用例
エンティティの定義(例: Userテーブルの作成)
@Entity
data class User(
@PrimaryKey val uid: Int,
@ColumnInfo(name = "first_name") val firstName: String?,
@ColumnInfo(name = "last_name") val lastName: String?
)
@Entityというアノテーションをつけることでテーブルになります。また、@PrimaryKeyは主キーで、@ColumnInfoはカラム名を設定します(@ColumnInfo(name = "first_name")の場合はfirst_nameというカラム名になります。nameがない場合はフィールド名(firstName)が設定されます)。
DAOの定義(例: UserDaoの実装)
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): List<User>
@Query("SELECT * FROM user WHERE uid IN (:userIds)")
fun loadAllByIds(userIds: IntArray): List<User>
@Query("SELECT * FROM user WHERE first_name LIKE :first AND " +
"last_name LIKE :last LIMIT 1")
fun findByName(first: String, last: String): User
@Insert
fun insertAll(vararg users: User)
@Delete
fun delete(user: User)
}
@DaoというアノテーションをつけることでDaoを実装します。@Queryをつけることでクエリを実装することができます。また、@Insertでデータの追加、 @Deleteでデータの削除が実装できます(insertAllはvarargがあるので、複数のUserを追加できます)。
データベースの定義
@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun userDao(): UserDao
}
@Databaseでデータベースを定義できます。この時、クラスは、RoomDatabaseを拡張する抽象クラスである必要があります。また、DAOクラスを抽象メソッドとして定義することで、DAOを使用できます。
使用する
#データベースのインスタンスの作成
val db = Room.databaseBuilder(
applicationContext,
AppDatabase::class.java, "database-name"
).build()
#DAOのインスタンスの作成
val userDao = db.userDao()
val users: List<User> = userDao.getAll()
Room.databaseBuilderでデータベースのインスタンスを作成します。AppDatabase::class.javaのAppDatabaseは@Databaseで作成した抽象クラス名です。"database-name”はデバイスのストレージに保存されるSQLiteファイルのファイル名になります。
終わりに
Android Developersにあるドキュメントを参考に、Roomについてまとめてみました。もっと詳細なことが知りたい方はAndroid Developersのドキュメントを見てみてください。
参考文献