Room 永続ライブラリには、SQLite API を直接使用するよりも多くのメリットがあります。
- SQL クエリのコンパイル時検証
- 繰り返しが多く間違いを犯しやすいボイラープレート コードを最小限に抑える便利なアノテーション
- 効率的なデータベース移行パス
アプリに Room 以外の SQLite 実装がある場合は、このページを読み、Room に移行する方法についてご確認ください。Room がアプリで使用する最初の SQLite 実装である場合は、基本的な使用方法について、Room を使用してローカル データベースにデータを保存するをご覧ください。
移行手順
SQLite の実装を Room に移行する手順は次のとおりです。SQLite の実装で大規模なデータベースや複雑なクエリを使用している場合は、Room に徐々に移行することをおすすめします。増分 移行戦略の詳細については、増分移行をご覧ください。
依存関係を更新する
アプリで Room を使用するには、アプリの build.gradle ファイルに適切な依存関係を含める必要があります。Room の依存関係について詳しくは、
設定をご覧ください。
モデルクラスをデータ エンティティに更新する
Room は、データ エンティティを使用してデータベース内のテーブルを表します。各エンティティ クラスはテーブルを表し、そのテーブル内の列を表すプロパティを持っています。既存のモデルクラスを Room エンティティに更新する手順は次のとおりです。
- クラス宣言に
@Entityアノテーションを付けて、 Room エンティティであることを示します。必要に応じてtableNameプロパティを使用して、結果のテーブルの名前をクラス名と異なる名前にすることができます。 - 主キー プロパティに
@PrimaryKeyアノテーションを付けます。 - 結果のテーブルの列の名前を対応するプロパティの名前と異なる名前にする場合は、プロパティに
@ColumnInfoアノテーションを付け、nameプロパティを正しい列名に設定します。 - データベースに保持しないプロパティがクラスにある場合は、
それらのプロパティに
@Ignoreアノテーションを付けて、対応するテーブルで Room が それらのプロパティの列を作成すべきでないことを示します。 - 複数のコンストラクタがクラスにある場合は、他のすべてのコンストラクタに
@Ignoreアノテーションを付けて、Room で使用するコンストラクタを指定します。
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val id: String, @ColumnInfo(name = "username") val userName: String?, @ColumnInfo(name = "last_update") val date: Date?, )
DAO を作成する
Room はデータ アクセス オブジェクト(DAO)を使用して、データベースにアクセスする関数を定義します。Room DAO を使用してデータにアクセスするのガイダンスに沿って、既存のクエリ関数を DAO に置き換えてください。
データベース クラスを作成する
Room の実装では、データベース クラスを使用してデータベースのインスタンスを管理します。データベース クラスは RoomDatabase を拡張して、
定義したすべてのエンティティと DAO を参照する必要があります。
@Database(entities = [User::class], version = 2) @ColumnTypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
移行パスを定義する
データベースのバージョン番号が変更されるため、既存のデータベース データを保持するには
Migration オブジェクトを定義する必要があります。データベース スキーマが変更されない場合、この移行は空にできます。
val MIGRATION_1_2 = object : Migration(1, 2) { override suspend fun migrate(connection: SQLiteConnection) { // Empty implementation, because the schema isn't changing. } }
Room のデータベース移行パスの詳細については、 データベースを移行するをご覧ください。
データベースのインスタンス化を更新する
データベース クラスと移行パスを定義したら、
Room.databaseBuilder を使用して、
移行パスを適用したデータベースのインスタンスを作成できます。
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name") .addMigrations(MIGRATION_1_2) .build()
実装をテストする
新しい Room の実装を必ずテストしてください。
- 移行をテストするのガイダンスに沿って、データベースの 移行をテストします。
- データベースをテストするのガイダンスに沿って、DAO 関数をテストします。
増分移行
アプリで大規模かつ複雑なデータベースを使用していると、アプリを一度に Room に移行することは現実的でない場合があります。代わりに、最初のステップとしてデータ エンティティと Room データベースを必要に応じて実装してから、後でクエリ関数を DAO に移行することもできます。
増分移行を実装するには、androidx.room3:room3-sqlite-wrapper アーティファクトの roomDatabase.getSupportWrapper 拡張関数を使用して、SupportSQLiteDatabase 互換性ラッパーを取得します。このラッパーを使用すると、Android SQLite API を使用して、Room で管理されるデータベースに対して Android スタイルの SQL クエリを直接実行できます。
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")