0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

はじめに

こんにちは、趣味で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のドキュメントを見てみてください。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?