Room 3.0

  
Room 永続ライブラリは SQLite 全体に抽象化レイヤを提供することで、データベースへのより安定したアクセスを可能にし、SQLite を最大限に活用できるようにします。
最新の更新 安定版リリース リリース候補版 ベータ版リリース アルファ版リリース
2026 年 6 月 17 日 - 3.0.0-rc01 - -

依存関係の宣言

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-rc01

2026 年 6 月 17 日

androidx.room3:room3-*:3.0.0-rc01 がリリースされました。バージョン 3.0.0-rc01 には、これらの commit が含まれています。

新機能

  • DAO クエリ結果で使用されるデータクラスで、デフォルト値を持つパラメータのサポートを追加しました。列を表すプロパティがデフォルト値を持つコンストラクタの一部である場合、そのプロパティは省略可能とみなされ、結果の列は必須になりません。(34279ab/70762008b/193531601

API の変更

  • コンバージョンのスコープをより明確にし、@DaoReturnTypeConverter との対称性を持たせるため、@TypeConverter の名前を @ColumnTypeConverter に変更しました。(I24420b/438041176
  • カスタム DAO の戻り値の型 @ProvidedDaoReturnTypeConveter を提供するための API を追加しました。(I2a8adb/517485682
  • PrimaryKey.autoGenerate が true に設定されている場合に主キー生成アルゴリズムを指定する PrimaryKey.algorihtm プロパティを追加しました。(I57944b/70053837

バージョン 3.0.0-alpha06

2026 年 6 月 3 日

androidx.room3:room3-*:3.0.0-alpha06 がリリースされました。バージョン 3.0.0-alpha06 に含まれる commit については、こちらをご覧ください。

API の変更

  • @EntitywithoutRowId という新しいアノテーション プロパティを追加します。このプロパティを true に設定すると、WITHOUT ROWID オプションを使用してバッキング SQLite テーブルが作成されます。(Idb48eb/472790803

バージョン 3.0.0-alpha05

2026 年 5 月 19 日

androidx.room3:room3-*:3.0.0-alpha05 がリリースされました。バージョン 3.0.0-alpha05 に含まれる commit については、こちらをご覧ください。

API の変更

  • parentColumns プロパティと entityColumns プロパティが、関係の解決にキーとして使用される列名の配列になるように @Relation@Junction を更新します。これにより、複合関係キーがサポートされます。(I92196b/64247765

バージョン 3.0.0-alpha04

2026 年 5 月 6 日

androidx.room3:room3-*:3.0.0-alpha04 がリリースされました。バージョン 3.0.0-alpha04 に含まれる commit については、こちらをご覧ください。

API の変更

  • Room の接続プールを構成する API を追加。ビルダー関数 setSingleConnectionPool()setMultipleConnectionPool() を使用して、Room がデータベースに対して開く接続の最大数を制御できます。(I9700db/438041176b/432820350
  • 他の公開 API が構成を参照していないため、Room の DatabaseConfiguration を公開 API から削除しました。(I5f1e9b/438041176

バグの修正

  • OPFS で発生する「データベースがロックされた」問題(b/496255935)を回避するため、ウェブ ターゲットが単一の接続プールを使用するように制限します。
  • Room が生成する onValidateSchema が大きすぎるために発生する「Method too large」エラーを(再度)修正しようとします。関数はステートメントの数に基づいて分割されますが、測定は正確ではありません。このエラーが引き続き発生する場合は、アノテーション プロセッサ オプション room.validationSplitSize を使用して、分割の対象となるステートメントの数を調整できます。デフォルト値は現在 300 ステートメントに設定されているため、問題が解決しない場合は、より小さい値を使用してください(b/493708172)。

バージョン 3.0.0-alpha03

2026 年 4 月 8 日

androidx.room3:room3-*:3.0.0-alpha03 がリリースされました。バージョン 3.0.0-alpha03 に含まれる commit については、こちらをご覧ください。

API の変更

  • @Database 宣言でコンストラクタが参照されるときに Lint 警告が表示されないように、RoomDatabase の引数なしのコンストラクタを public にします。(I9bac2b/494722261
  • Android Context を受け取らない Room.inMemoryDatabaseBuilderRoom.databaseBuilder のバージョンを追加します。Room 3.0 では Context の必要性が大幅に軽減されたため、Builder のオプション値にすることで、共通コードでインメモリ データベースをより簡単に作成できるようになりました。(I5d502b/438041176

バグの修正

  • onValidateSchema 関数の本体が大きすぎる場合に、JVM と Android の生成コードで「コードが大きすぎる」エラーが発生する問題を修正しました(b/493708172)。

バージョン 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_ASCIITOKENIZER_TRIGRAM)と、「詳細」FTS オプションの列挙型(FULLCOLUMNNONE)が含まれます。(I90934b/146824830
  • ルーム ページング ターゲット: room3-pagingjswasmJstvOSwatchOS ターゲットを追加しました。(Icffd3b/432783733

API の変更

  • マルチプラットフォーム clearAllTables(): clearAllTables() を共通化し、すべてのプラットフォームで利用できるようにします。また、suspend 関数に変換されました。(I434aeb/322846465
  • 破壊的な移行: fallbackToDestructiveMigration API の dropAllTables にデフォルトのパラメータ値を追加しました。(Ica88bb/438041176
  • 試験運用版 API の変更:

    1. アノテーション ベースの API を試験運用版としてマークできるように、@ExperimentalRoomApiroom-common に移動しました。

    2. Room データベース宣言での @ConstructedBy の要件を抑制するために、試験的な RoomWarning を追加しました。この場合、DatabaseConstructor は生成されず、ファクトリ実装は DatabaseBuilder を介して提供する必要があります。(If5443

バグの修正

  • ページング ソース: 変換関数が READ クエリ用であることを正しく示すように PagingSourceDaoReturnTypeConverter を更新しました。(I3b067b/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 を介して取得できます。この 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-runtimeandroidx.room3:room3-runtime になり、androidx.room.RoomDatabase などのクラスは androidx.room3.RoomDatabase に配置されます。

SupportSQLite API がない

Room 3.0 は SQLiteDriver API によって完全にサポートされており、SupportSQLiteDatabase などの SupportSQLite 型や Cursor などの Android 型を参照しなくなりました。SupportSQLiteDatabase をミラーリングする RoomDatabase API と SupportSQLiteOpenHelper を取得する API が削除されたため、これは Room 3.0 と 2.x の間で最も大きな変更となります。RoomDatabase をビルドするには、SQLiteDriver必須になりました。

たとえば、データベースの直接操作用の 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 を使用すると、RoomDatabaseSupportSQLiteDatabase に変換できます。roomDatabase.openHelper.writableDatabase の呼び出しは roomDatabase.getSupportWrapper() に置き換えることができます。

Kotlin とコルーチンを優先

ライブラリをより進化させるため、Room 3.0 では Kotlin コードのみが生成され、Kotlin Symbol Processor(KSP)のみが使用されます。Room 2.x と比較して、Room 3.0 では Java コードの生成と KAPT または JavaAP によるアノテーション プロセッサの設定はできなくなりました。KSP は Java ソースを処理でき、Room コンパイラはソース宣言が Java で記述されているデータベース、エンティティ、DAO のコードを生成します。Room の使用が集中し、Kotlin Gradle プラグインと KSP をコードベースの残りの部分に影響を与えることなく適用できるマルチモジュール プロジェクトにすることをおすすめします。

Room 3.0 ではコルーチンの使用も必須です。具体的には、Flow やカスタム DAO 戻り値の型などのリアクティブ型を返す場合を除き、DAO 関数は一時停止する必要があります。データベース オペレーションを実行する Room API も、RoomDatabase.useReaderConnectionRoomDatabase.useWriterConnection などの suspend 関数です。

Room 2.x とは異なり、Executor を使用して RoomDatabase を構成することはできなくなりました。代わりに、データベースのビルダーを介して CoroutineContext とディスパッチャーを提供できます。

Room 3.0 の InvalidationTracker API は Flow ベースです。InvalidationTracker.Observer は、関連する API addObserver および removeObserver とともに削除されました。データベース オペレーションに応答するメカニズムは、InvalidationTrackercreateFlow() 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 リリースでは、KMP ターゲットとして JavaScript と WasmJs が追加されています。JavaScript と WasmJs をターゲットとする SQLiteDriver インターフェース(androidx.sqlite:sqlite)のリリースと、新しいアーティファクト androidx.sqlite:sqlite-web にある新しいドライバ WebWorkerSQLiteDriver を組み合わせることで、すべての主要な KMP プラットフォームをターゲットとする共通コードで Room を使用できます。

ウェブ プラットフォームの非同期の性質により、SQLiteStatement を引数として受け取る Room API はサスペンド関数になりました。これらの関数の例としては、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 を追加)を持つ一時停止拡張関数も追加されています。これらの 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 の実装です。WebWorkerSQLiteDriver は、Web Worker と通信してメインスレッド外でデータベース オペレーションを実行し、Origin Private File System(OPFS)にデータベースを保存できるようにします。ドライバをインスタンス化するには、簡単な通信プロトコルを実装するワーカーが必要です。このプロトコルについては、WebWorkerSQLiteDriver KDoc で説明しています。

現在、WebWorkerSQLiteDriver には通信プロトコルを実装するデフォルトのワーカーは付属していませんが、例として、androidx コードベースにはプロジェクトで使用できるワーカー実装が含まれています。SQLite の 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 戻り値の型の統合が、Room 3.0 の DAO 戻り値の型コンバータと呼ばれる新しい API を使用するように変換されました。DAO 戻り値の型コンバータ関数(@DaoReturnTypeConverter)を使用すると、DAO 関数の結果をアノテーション付き関数で定義されたカスタム型に変換できます。これらの関数を使用すると、クエリ結果をデータ オブジェクトに変換する Room の生成コードに参加できます。DAO 戻り値の型コンバータを含むクラスは、@Database または @Dao 宣言の @DaoReturnTypeConverters アノテーションを介して登録する必要があります。

たとえば、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 戻り値の型コンバータの作成要件について詳しくは、@DaoReturnTypeConverter API の KDoc をご覧ください。