Room 3.0
| 最新の更新 | 安定版リリース | リリース候補版 | ベータ版リリース | アルファ版リリース |
|---|---|---|---|---|
| 2026 年 3 月 25 日 | - | - | - | 3.0.0-alpha02 |
依存関係の宣言
Room3 への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリ をご覧ください。
アプリまたはモジュールの build.gradle ファイルに、必要なアーティファクトの依存関係を追加します。
Kotlin
dependencies { val room_version = "" implementation("androidx.room3:room3-runtime:$room_version") ksp("androidx.room3:room3-compiler:$room_version") }
Groovy
dependencies { def room_version = "" implementation "androidx.room3:room3-runtime:$room_version" ksp "androidx.room3:room3-compiler:$room_version" }
KSP プラグインの使用方法については、KSP クイックスタート ドキュメントをご覧ください。
依存関係について詳しくは、ビルド依存関係の追加をご覧ください。
Room Gradle プラグインを使用する
Room Gradle プラグインを使用して、Room コンパイラのオプションを構成できます。 このプラグインは、生成されたスキーマ(コンパイル タスクの出力であり、自動移行に使用される)が、再現可能でキャッシュ可能なビルドになるように正しく構成されるようにプロジェクトを構成します。
プラグインを追加するには、トップレベルの Gradle ビルドファイルで、プラグインとそのバージョンを定義します。
Groovy
plugins { id 'androidx.room3' version "$room_version" apply false }
Kotlin
plugins { id("androidx.room3") version "$room_version" apply false }
モジュール レベルの Gradle ビルドファイルで、プラグインを適用して room3 拡張機能を使用します。
Groovy
plugins { id 'androidx.room3' } room3 { schemaDirectory "$projectDir/schemas" }
Kotlin
plugins { id("androidx.room3") } room3 { schemaDirectory("$projectDir/schemas") }
Room Gradle プラグインを使用する場合は、schemaDirectory を設定する必要があります。これにより、Room コンパイラとさまざまなコンパイル タスクとそのバックエンド(kotlinc、KSP)が、フレーバー付きフォルダ(schemas/flavorOneDebug/com.package.MyDatabase/1.json など)にスキーマ ファイルを出力するように構成されます。これらのファイルは、検証と自動移行に使用するためにリポジトリにチェックインする必要があります。
フィードバック
お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。
詳細については、Issue Tracker のドキュメント をご覧ください。
バージョン 3.0
バージョン 3.0.0-alpha02
2026 年 3 月 25 日
androidx.room3:room3-*:3.0.0-alpha02 がリリースされました。バージョン 3.0.0-alpha02 に含まれる commit については、こちらをご覧ください。
新機能
- FTS5 のサポート:
@Fts5アノテーションを使用して、Room に FTS5 のサポートを追加しました。これには、FTS5 トークナイザ(TOKENIZER_ASCIIとTOKENIZER_TRIGRAM)の新しい定数と、「詳細」FTS オプション(FULL、COLUMN、NONE)の列挙型が含まれます。(I90934、b/146824830) - Room Paging ターゲット:
room3-pagingにjs、wasmJs、tvOS、watchOSターゲットを追加しました。(Icffd3、b/432783733)
API の変更
- マルチプラットフォーム
clearAllTables():clearAllTables()を共通化し、すべてのプラットフォームで使用できるようにしました。suspend関数にも変換されました。(I434ae、b/322846465) - 破壊的な移行:
fallbackToDestructiveMigrationAPI のdropAllTablesにデフォルトのパラメータ値を追加しました。(Ica88b、b/438041176) 試験運用版 API の変更:
@ExperimentalRoomApiをroom-commonに移動し、アノテーション ベースの API を試験運用版としてマークできるようにしました。試験運用版の
RoomWarningを追加して、Room データベース宣言での@ConstructedByの要件を抑制しました。この場合、DatabaseConstructorは生成されず、DatabaseBuilderを介してファクトリ実装を提供する必要があります。(If5443)
バグの修正
- Paging Source:
PagingSourceDaoReturnTypeConverterを更新して、その convert 関数が READ クエリ用であることを正しく示すようにしました。(I3b067、b/139872302)
バージョン 3.0.0-alpha01
2026 年 3 月 11 日
androidx.room3:room3-*:3.0.0-alpha01 がリリースされました。
Room 3.0(パッケージ androidx.room3)は、Kotlin Multiplatform(KMP)に重点を置いた Room 2.x
パッケージ(androidx.room)のメジャー バージョン アップデートです。
コア アノテーション API は、主なコンポーネントとともに維持されます。
androidx.room3.RoomDatabaseを拡張し、@Databaseでアノテーションが付けられた抽象クラスは、Room のアノテーション プロセッサのエントリ ポイントです。- データベース宣言には、データベース スキーマを記述する 1 つ以上のデータクラスがあり、
@Entityでアノテーションが付けられています。 - データベース オペレーションは、
@Queryアノテーションで SQL ステートメントが定義されたクエリ関数を含む@Dao宣言で定義されます。 - 実行時に、データベース実装は
RoomDatabase.Builderを介して取得できます。これは、データベースの構成にも使用されます。
Room を使用してローカル データベースにデータを保存する ガイドのドキュメントのほとんどは、Room 3.0 にも 適用されます。
Room 2.x との主な互換性を破る変更点は次のとおりです。
- 新しいパッケージ
androidx.room3。 androidx.room3:room3-sqlite-wrapperを使用していない限り、SupportSQLite API はサポートされなくなりました。- すべてのデータベース オペレーションがコルーチン API ベースになりました。
- Kotlin コードの生成のみ。
- Kotlin Symbol Processing(KSP)が必要です。
互換性を破る変更に加えて、Room 3.0 では 2.x と比較して新しい機能が導入されています。
- JS と WasmJS のサポート
- カスタム DAO 戻り値の型
新しいパッケージ
既存の Room 2.x 実装との互換性の問題を防ぎ、Room に推移的な依存関係を持つライブラリ(WorkManager など)に対応するため、Room 3.0 は新しいパッケージに存在します。つまり、新しい Maven グループとアーティファクト ID があります。たとえば、androidx.room:room-runtime は androidx.room3:room3-runtime になり、androidx.room.RoomDatabase などのクラスは androidx.room3.RoomDatabase に配置されます。
SupportSQLite API なし
Room 3.0 は SQLiteDriver
API
によって完全にサポートされており、SupportSQLite 型(SupportSQLiteDatabase
など)や Android 型(Cursor など)を参照しなくなりました。SupportSQLiteDatabase をミラーリングする RoomDatabase API と SupportSQLiteOpenHelper を取得する API が削除されたため、これは Room 3.0 と 2.x の間で最も重要な変更です。RoomDatabase をビルドするには、SQLiteDriver が必須になりました。
たとえば、直接データベース オペレーション用の API は、ドライバの同等の API に置き換えられます。
// Room 2.x
roomDatabase.runInTransaction { ... }
// Room 3.x
roomDatabase.withWriteTransaction { ... }
// Room 2.x
roomDatabase.query("SELECT * FROM Song").use { cursor -> ... }
// Room 3.x
roomDatabase.useReaderConnection { connection ->
connection.usePrepared("SELECT * FROM Song") { stmt -> ... }
}
引数として SupportSQLiteDatabase を持つコールバック API も、引数として SQLiteConnection を持つ同等の API に置き換えられました。
これらは、Migration.onMigrate() や AutoMigrationSpec.onPostMigrate() などの移行コールバック関数と、RoomDatabase.Callback.onCreate()、RoomDatabase.Callback.onOpen() などのデータベース コールバックです。
KMP プロジェクトで Room を使用している場合は、インポート参照の更新がほとんどであるため、3.0 への移行は 簡単です。それ以外の場合は、Android 専用の Room から KMP への移行と同じ 移行戦略が適用されます。Room KMP 移行ガイドをご覧ください。
SupportSQLite ラッパー
Room 3.x では、移行を容易にするために 2.x で作成された SupportSQLite ラッパーが保持され、新しいアーティファクト androidx.room3:room3-sqlite-wrapper に配置されるようになりました。互換性 API を使用すると、RoomDatabase を SupportSQLiteDatabase に変換できます。roomDatabase.openHelper.writableDatabase の呼び出しは roomDatabase.getSupportWrapper() に置き換えることができます。
Kotlin とコルーチンを優先
ライブラリをより適切に進化させるため、Room 3.0 では Kotlin コードのみが生成され、Kotlin Symbol Processor(KSP)のみが使用されます。Room 2.x と比較して、Java コードの生成はなく、KAPT または JavaAP を介したアノテーション プロセッサの構成は Room 3.0 ではできなくなりました。KSP は Java ソースを処理でき、Room コンパイラはソース宣言が Java で記述されているデータベース、エンティティ、DAO のコードを生成します。Room の使用が集中し、コードベースの残りの部分に影響を与えることなく Kotlin Gradle プラグインと KSP を適用できるマルチモジュール プロジェクトを使用することをおすすめします。
Room 3.0 ではコルーチンの使用も必要です。具体的には、リアクティブ型(Flow やカスタム DAO 戻り値の型など)を返さない限り、DAO 関数は suspend 関数にする必要があります。データベース オペレーションを実行する Room API も、RoomDatabase.useReaderConnection や RoomDatabase.useWriterConnection などの suspend 関数です。
Room 2.x とは異なり、Executor で RoomDatabase を構成することはできなくなりました。代わりに、ディスパッチャーとともに CoroutineContext をデータベースのビルダーを介して提供できます。
InvalidationTracker API は Room 3.0 では Flow ベースです。
InvalidationTracker.Observer は、関連する API
addObserver と removeObserver とともに削除されました。データベース オペレーションに応答するメカニズムは、InvalidationTracker の createFlow() API を介して作成できるコルーチン Flow を介して行われます。
使用例:
fun getArtistTours(from: Date, to: Date): Flow<Map<Artist, TourState>> {
return db.invalidationTracker.createFlow("Artist").map { _ ->
val artists = artistsDao.getAllArtists()
val tours = tourService.fetchStates(artists.map { it.id })
associateTours(artists, tours, from, to)
}
}
ウェブサポート
Room 3.0 リリースでは、JavaScript と WasmJs が KMP ターゲットとして追加されました。
JavaScript と WasmJs をターゲットとする SQLiteDriver インターフェース(androidx.sqlite:sqlite)のリリースと、新しいアーティファクト androidx.sqlite:sqlite-web にある新しいドライバ WebWorkerSQLiteDriver
を組み合わせることで、すべての主要な KMP プラットフォームをターゲットとする共通コードで Room を使用できます。
ウェブ プラットフォームは非同期であるため、SQLiteStatement を引数として受け取る Room API は suspend 関数になりました。これらの関数の例としては、Migration.onMigrate()、RoomDatabase.Callback.onCreate()、PooledConnection.usePrepared() などがあります。ドライバ API では、非同期 API はすべてのプラットフォームで共通であり、同期 API はウェブ以外のターゲットで共通です。そのため、ウェブをターゲットとしないプロジェクトでは、共通コードで同期 API(SQLiteDriver.open()、SQLiteConnection.prepare()、SQLiteStatement.step())を引き続き使用できます。
一方、ウェブのみをターゲットとするプロジェクトでは、非同期 API(SQLiteDriver.openAsync()、SQLiteConnection.prepareAsync()、SQLiteStatement.stepAsync())を使用する必要があります。
便宜上、androidx.sqlite パッケージには、前述の API の同期名(SQLiteConnection.executeSQL を追加)を持つ suspend 拡張関数も追加されました。これらの API は、プロジェクトがウェブ プラットフォームとウェブ以外のプラットフォームの両方をターゲットとする場合に推奨されます。これは、API が expect / actual 宣言であり、プラットフォームに基づいて適切なバリアントを呼び出すためです。これらは、Room のランタイムで使用される API であり、サポートされているすべてのプラットフォームの共通コードでドライバを使用できます。
使用例:
import androidx.sqlite.executeSQL
import androidx.sqlite.step
roomDatabase.useWriterConnection { connection ->
val deletedSongs = connection.usePrepared(
"SELECT count(*) FROM Song"
) { stmt ->
stmt.step()
stmt.getLong(0)
}
connection.executeSQL("DELETE FROM Song")
deletedSongs
}
WebWorkerSQLiteDriver は、メインスレッド外でデータベース オペレーションを実行するためにSQLiteDriver と
ウェブワーカー
通信する実装であり、Origin Private File System(OPFS)に
データベースを保存できます。ドライバをインスタンス化するには
簡単な通信プロトコルを実装するワーカーが必要です。
プロトコルについては、WebWorkerSQLiteDriver
KDocをご覧ください。
現在、WebWorkerSQLiteDriver には通信プロトコルを実装するデフォルトのワーカーは付属していませんが、例として、androidx コードベースには、プロジェクトで使用できる worker
implementation が含まれています。SQLite's
WASM を使用し、データベースを
OPFS に保存します。サンプル ワーカーはローカル NPM パッケージとして公開されており、
Kotlin が NPM 依存関係をサポートしているため、
ワーカーを提供する小さな KMP モジュールを作成できます。
Room のローカル ウェブワーカーの使用方法を示す GitHub プロジェクト をご覧ください。
プロジェクトでワーカーを設定したら、ウェブ用の Room の構成は他のプラットフォームと同様です。
fun createDatabase(): MusicDatabase {
return Room.databaseBuilder<MusicDatabase>("music.db")
.setDriver(WebWorkerSQLiteDriver(createWorker()))
.build()
}
fun createWorker() =
Worker(js("""new URL("sqlite-web-worker/worker.js", import.meta.url)"""))
ウェブ ドライバの今後のバージョンでは、NPM で公開されるデフォルトのワーカーが含まれる可能性があり、ウェブの設定が簡単になります。
カスタム DAO 戻り値の型
RxJava や Paging などのさまざまな DAO 戻り値の型の統合は、DAO 戻り値の型コンバータと呼ばれる Room 3.0 の新しい API を使用するように変換されました。
DAO 戻り値の型コンバータ関数(@DaoReturnTypeConverter)を使用すると、DAO 関数の結果を、アノテーション付き関数で定義されたカスタム型に変換できます。これらの関数を使用すると、クエリ結果をデータ オブジェクトに変換する Room の生成コードに参加できます。DAO 戻り値の型コンバータを含むクラスは、
または@Dao
宣言の
@DaoReturnTypeConvertersアノテーションを介して登録する必要があります。@Database
たとえば、DAO クエリで PagingSource を返すには、androidx.room3:room3-paging にあるコンバータ クラスを登録する必要があります。
@Dao
@DaoReturnTypeConverters(PagingSourceDaoReturnTypeConverter::class)
interface MusicDao {
@Query("SELECT * FROM Song)
fun getSongsPaginated(): PagingSource<Int, Song>
}
既存の統合は、DAO 戻り値の型コンバータに移動されました。
| 戻り値の型 | コンバータ クラス | アーティファクト |
|---|---|---|
| PagingSource | PagingSourceDaoReturnTypeConverter | androidx.room3:room3-paging |
| Observable、Flowable、Completable、Single、Maybe | RxDaoReturnTypeConverters | androidx.room3:room3-rxjava3 |
| ListenableFuture | GuavaDaoReturnTypeConverter | androidx.room3:room3-guava |
| LiveData | LiveDataDaoReturnTypeConverter | androidx.room3:room3-livedata |
列型コンバータと同様に、DAO 戻り値の型コンバータはアプリケーションで定義できます。たとえば、アプリケーションはウェブ型 kotlin.js.Promise の @DaoReturnTypeConverter を宣言できます。
object PromiseDaoReturnTypeConverter {
@DaoReturnTypeConverter([OperationType.READ, OperationType.WRITE])
fun <T> convert(
db: RoomDatabase,
executeAndConvert: suspend () -> T
): Promise<T> {
return db.getCoroutineScope().promise { executeAndConvert() }
}
}
上記のコンバータを使用すると、DAO クエリ関数は Promise を返すことができます。
@Dao
@DaoReturnTypeConverters(PromiseDaoReturnTypeConverter::class)
interface MusicDao {
@Query("SELECT * FROM Song")
fun getAllSongs(): Promise<List<Song>>
}
@DaoReturnTypeConverter 関数には、必要なパラメータの数とその型に関する要件がいくつかあります。使用可能なパラメータは次のとおりです。
db: RoomDatabase: (省略可)RoomDatabaseインスタンスへのアクセスを提供します。これは、追加のデータベース オペレーションの実行 やコルーチン スコープへのアクセスに役立ちます。tableNames: Array<String>: (省略可)クエリでアクセスされたテーブルが含まれます。Room のInvalidationTracker.createFlow()API と組み合わせると、オブザーバブル型 / リアクティブ型のサポートに役立ちます。rawQuery: RoomRawQuery: (省略可)実行時にクエリのインスタンスが含まれます。これにより、PagingSourceDaoReturnTypeConverterによって実装されるLIMIT/OFFSET戦略などの変換が可能になります。executeAndConvert: suspend () -> T: (必須)クエリを実行し、その結果をデータ オブジェクトに解析する Room 生成関数 。
DAO 戻り値の型
コンバータの作成要件について詳しくは、API の @DaoReturnTypeConverter
KDoc をご覧ください。