Room
最新の更新 | 安定版リリース | リリース候補版 | ベータ版リリース | アルファ版リリース |
---|---|---|---|---|
2024 年 12 月 11 日 | 2.6.1 | - | - | 2.7.0-alpha12 |
依存関係の宣言
Room への依存関係を追加するには、Google の Maven リポジトリをプロジェクトに追加する必要があります。詳しくは、Google の Maven リポジトリをご覧ください。
Room の依存関係には、Room による移行のテストと Room RxJava が含まれます。
アプリまたはモジュールの build.gradle
ファイルに、必要なアーティファクトの依存関係を追加します。
Kotlin
dependencies { val room_version = "2.6.1" implementation("androidx.room:room-runtime:$room_version") // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See Add the KSP plugin to your project ksp("androidx.room:room-compiler:$room_version") // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
Groovy
dependencies { def room_version = "2.6.1" implementation "androidx.room:room-runtime:$room_version" // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See KSP Quickstart to add KSP to your build ksp "androidx.room:room-compiler:$room_version" // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
KAPT プラグインの使用方法については、KAPT のドキュメントをご覧ください。
KSP プラグインの使用方法については、KSP クイックスタートのドキュメントをご覧ください。
Kotlin 拡張機能の使用方法については、ktx のドキュメントをご覧ください。
依存関係について詳しくは、ビルド依存関係の追加をご覧ください。
Android 以外のライブラリ(Java または Kotlin のみの Gradle モジュールなど)の場合は、必要に応じて androidx.room:room-common
を利用して Room アノテーションを使用できます。
コンパイラ オプションの構成
Room のアノテーション プロセッサ オプションは次のとおりです。
room.schemaLocation |
directory
指定したディレクトリの JSON ファイルにデータベース スキーマをエクスポートできるようにします。詳しくは、Room の移行をご覧ください。 |
room.incremental |
boolean
Gradle の増分アノテーション プロセッサを有効にします。デフォルト値は true です。 |
room.generateKotlin |
boolean
Java ではなく Kotlin ソースファイルを生成します。KSP が必要です。 デフォルト値は false です。詳しくは、バージョン 2.6.0 のリリースノートをご覧ください。
|
Room Gradle プラグインを使用する
Room バージョン 2.6.0 以降では、Room Gradle プラグインを使用して Room コンパイラ用のオプションを構成できます。このプラグインは、生成されたスキーマ(コンパイル タスクの出力で、自動移行に使用されます)が再現可能でキャッシュに保存可能なビルドになるように、プロジェクトを正しく構成します。
プラグインを追加するには、最上位の Gradle ビルドファイルで、プラグインとそのバージョンを定義します。
Groovy
plugins { id 'androidx.room' version "$room_version" apply false }
Kotlin
plugins { id("androidx.room") version "$room_version" apply false }
モジュール レベルの Gradle ビルドファイルで、プラグインを適用し、room
拡張機能を使用します。
Groovy
plugins { id 'androidx.room' } android { ... room { schemaDirectory "$projectDir/schemas" } }
Kotlin
plugins { id("androidx.room") } android { ... room { schemaDirectory("$projectDir/schemas") } }
Room Gradle プラグインを使用する場合は、schemaDirectory
を設定する必要があります。これにより、Room コンパイラとさまざまなコンパイル タスクとそのバックエンド(javac、KAPT、KSP)が構成され、スキーマ ファイルがフレーバー フォルダ(schemas/flavorOneDebug/com.package.MyDatabase/1.json
など)に出力されます。これらのファイルは、検証と自動移行に使用するためにリポジトリにチェックインする必要があります。
一部のオプションは、Room コンパイラでサポートされているにもかかわらず、Room Gradle プラグインのすべてのバージョンで構成することはできません。次の表に、各オプションと、room
拡張機能を使用してそのオプションの構成をサポートする Room Gradle プラグインのバージョンを示します。バージョンがそれより前の場合や、このオプションがまだサポートされていない場合は、代わりにアノテーション プロセッサ オプションを使用できます。
オプション | バージョン |
---|---|
room.schemaLocation (必須) |
2.6.0 |
room.incremental |
- |
room.generateKotlin |
- |
アノテーション プロセッサ オプションを使用する
Room Gradle プラグインを使用していない場合や、必要なオプションがプラグインのバージョンでサポートされていない場合は、ビルド依存関係を追加するで説明されているように、アノテーション プロセッサ オプションを使用して Room を構成できます。アノテーション オプションを指定する方法は、Room に KSP と KAPT のどちらを使用するかによって異なります。
Groovy
// For KSP ksp { arg("option_name", "option_value") // other otions... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += [ "option_name":"option_value", // other options... ] } } } }
Kotlin
// For KSP ksp { arg("option_name", "option_value") // other options... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += mapOf( "option_name" to "option_value", // other options... ) } } } }
room.schemaLocation
はプリミティブ タイプではなくディレクトリであるため、このオプションを追加するときに CommandLineArgumentsProvider
を使用する必要があります。これにより、最新性チェックの実行時に Gradle がこのディレクトリを認識できるようになります。Room データベースを移行するでは、スキーマの場所を指定する CommandLineArgumentsProvider
の完全な実装を示しています。
フィードバック
お寄せいただいたフィードバックは Jetpack 改善の参考にさせていただきます。新しい問題が見つかった場合や、このライブラリを改善するアイデアをお持ちの場合は、お知らせください。新しい問題を報告していただく前に、このライブラリの既存の問題をご確認ください。スターボタンをクリックすると、既存の問題に投票できます。
詳細については、Issue Tracker のドキュメントをご覧ください。
バージョン 2.7
バージョン 2.7.0-alpha12
2024 年 12 月 11 日
androidx.room:room-*:2.7.0-alpha12
がリリースされました。バージョン 2.7.0-alpha12 に含まれる commit はこちらをご覧ください。
API の変更
- 試験運用版の API
RoomDatabase.Builder.setInMemoryTrackingMode()
を追加し、Room が無効化のトラッキングにインメモリ テーブルを使用するかどうかを設定できるようにしました。(I2a9b2、b/185414040)
バグの修正 - 破壊的な移行でビューが破棄され、再作成されるようになりました。これにより、allowDestructiveMigrationForAllTables
がオン(KMP のデフォルト)の場合の動作と、オフの場合の既存の動作が一致するようになりました。(0a3e83、b/381518941)
バージョン 2.7.0-alpha11
2024 年 10 月 30 日
androidx.room:room-*:2.7.0-alpha11
がリリースされました。バージョン 2.7.0-alpha11 に含まれる commit はこちらをご覧ください。
API の変更
- 新しく追加された
convertRows()
メソッドのシグネチャを再検討し、部屋のページング用のRawRoomQuery
を受け取る suspend 関数にします。(Ie57b5、b/369136627)
バグの修正
PagingSource
と組み合わせて@Relation
を使用すると無効なコードが生成される room-paging の問題を修正しました。
バージョン 2.7.0-alpha10
2024 年 10 月 16 日
androidx.room:room-*:2.7.0-alpha10
がリリースされました。バージョン 2.7.0-alpha10 に含まれる commit はこちらをご覧ください。
API の変更
- Android 以外のプラットフォームと JVM 以外のプラットフォームで
ByteBuffer
とのリレーションをサポートする内部ByteArrayWrapper
クラスを作成します。(I75543、b/367205685) - さまざまな
SQLITE_DATA_*
結果定数とともにSQLiteStatement.getColumnType()
を追加して、列のデータ型を取得できるようにします。(I1985c、b/369636251)
バージョン 2.7.0-alpha09
2024 年 10 月 2 日
androidx.room:room-*:2.7.0-alpha09
がリリースされました。バージョン 2.7.0-alpha09 に含まれる commit はこちらをご覧ください。
バグの修正
- 読み取り接続で書き込みトランザクションを開始したために
Error code: 8, message: attempt to write a readonly database
が発生するroom-paging
の KMP 実装の問題を修正しました。(b/368380988)
バージョン 2.7.0-alpha08
2024 年 9 月 18 日
androidx.room:room-*:2.7.0-alpha08
がリリースされました。バージョン 2.7.0-alpha08 に含まれる commit はこちらをご覧ください。
新機能
room-paging
アーティファクトは、KMP と互換性があるように移行されました。(Ib8756、b/339934824)- API
invalidationTrackerFlow()
は、InvalidationTracker.createFlow()
としてファーストパーティ API として共通化され、KMP プロジェクトの Android 以外のソースセットで使用できるようになりました。(I1fbfa、(I8fb29)、b/329291639、b/329315924)
API の変更
Cursor
という単語が使用されている Room の警告とエラー メッセージはすべて削除または置き換えられました。これは、Cursor
が KMP バージョンの Room で使用できる正確な一般的な用語ではなくなったためです。(Id8cd9、b/334087492)
バグの修正
- Room KMP が JVM 以外のプラットフォームで
UUID
を使用してコードを出力しようとする問題を修正しました。(b/362994709) - Compose マルチプラットフォームを使用した KMP プロジェクトで Room Gradle プラグインを使用すると、「変更のためにロックされた後、構成の属性を変更できません」などのエラーが発生する問題を修正しました。(b/343408758)
バージョン 2.7.0-alpha07
2024 年 8 月 21 日
androidx.room:room-*:2.7.0-alpha07
がリリースされました。バージョン 2.7.0-alpha07 に含まれる commit はこちらをご覧ください。
新機能
- Room Gradle プラグインは、エクスポートされたスキーマを Android インストルメンテーション テストのリソースソースに自動的に追加し、
MigrationTestHelper
で使用できるようにします。
バグの修正
RoomDatabaseConstructor
の生成された「actual」に、initialize
関数で「actual」修飾子が欠落している問題を修正しました(その関数が「expect」宣言でオーバーライドされている場合)。(359631627)RoomDatabaseConstructor
の生成された「実際」が「expect」宣言の公開設定と一致しない問題を修正しました。(358138953)
バージョン 2.7.0-alpha06
2024 年 8 月 7 日
androidx.room:room-*:2.7.0-alpha06
がリリースされました。バージョン 2.7.0-alpha06 には、これらの commit が含まれています。
API の変更
- KMP プロジェクトの
RoomDatabase
のインスタンス化設定を変更します。
Kotlin 2.0 コンパイルモデルにより、生成される関数(instantiateImpl()
という名前)を参照する戦略は、もはや有効ではありません。instantiateImpl()
戦略に代わる 2 つの新しい API(@ConstructedBy
と RoomDatabaseConstructor
)が導入されました。新しい戦略は次のとおりです。
RoomDatabaseConstructor
を実装する expect オブジェクトを定義するexpect object MyDatabaseCtor : RoomDatabaseConstructor<MyDatabase>
@ConstructedBy
を使用してオブジェクトを@Database
宣言にリンクする@Database(...) @ConstructedBy(MyDatabaseCtor::class) // NEW abstract class MyDatabase : RoomDatabase
ファクトリ パラメータを渡さずに新しいデータベース インスタンスを作成する
fun createNewDatabase(path: String) = Room.databaseBuilder<AppDatabase>(name = path) .setDriver(BundledSQLiteDriver()) .setQueryCoroutineContext(Dispatchers.IO) .build()
b/316978491、b/338446862、b/342905180 を修正
- Room KMP で
@RawQuery
をサポートするために、RoomRawQuery
という新しい API を追加しました。この API は、元の SQL 文字列を保持する点と、引数をステートメントにバインドする関数という点でSupportSQLiteQuery
に似ています。@RawQuery
アノテーション付きの関数で、RoomRawQuery
を単一のパラメータとして受け取ることができるようになりました。(Iea844、b/330586815) CoroutineContext
を受け入れるsetQueryCallback()
のオーバーロードを追加します。(Id66ff、b/309996304)linuxArm64
Kotlin マルチプラットフォーム ターゲットのサポートを追加しました。(I139d3、b/338268719)
バグの修正
- Android 以外のターゲットで Room が
recursiveFetchArrayMap
への呼び出しを誤って生成する問題を修正しました。(710c36、b/352482325) - KMP プロジェクトで Room が「接続の試行中にタイムアウトしました」という例外をスローすることがある問題を修正しました。(fa72d0、b/347737870)
- 他のテーブルが新しい外部キーに合わせてスキーマを変更する前に、外部キーをチェックしすぎる自動移行の問題を修正しました。(7672c0、b/352085724)
バージョン 2.7.0-alpha05
2024 年 7 月 10 日
androidx.room:room-*:2.7.0-alpha05
がリリースされました。バージョン 2.7.0-alpha05 には、これらの commit が含まれています。
API の変更
SQLiteKt
の名前をSQLite
に、BundledSQLiteKt
の名前をBundledSQLite
に変更しました。(I8b501)
バグの修正
AndroidSQLiteDriver
の使用時にRoomDatabase
がデッドロックする、または接続タイムアウトでエラーになるバグを修正しました。
バージョン 2.7.0-alpha04
2024 年 6 月 12 日
androidx.room:room-*:2.7.0-alpha04
がリリースされました。バージョン 2.7.0-alpha04 に含まれる commit はこちらをご覧ください。
バグの修正
- DAO でマルチマップ戻り値型が定義されている場合に、Room のアノテーション プロセッサで互換性のない KMP コードが生成される問題を修正しました。(b/340983093)
@Database
アノテーションが付与されたクラスにパッケージがない場合、Room が生成されたデータベース実装を見つけられない問題を修正しました。(b/342097292)- 自動クローズと複数インスタンスの無効化を有効にすると、アイドル状態のためにデータベースが自動的にクローズされたときに
ConcurrentModificationException
が発生することがある問題を修正しました。
バージョン 2.7.0-alpha03
2024 年 5 月 29 日
androidx.room:room-*:2.7.0-alpha03
がリリースされました。バージョン 2.7.0-alpha03 には、これらの commit が含まれています。
バグの修正
- Kotlin 2.0 と KSP 2.0 に関するさまざまな問題を修正。KSP 2 をサポートする Kotlin 2.0 は完成しておらず、チームは新しいコンパイラにおけるさまざまな API と動作の変更に取り組んでいます。(b/314151707)
バージョン 2.7.0-alpha02
2024 年 5 月 14 日
androidx.room:room-*:2.7.0-alpha02
がリリースされました。バージョン 2.7.0-alpha02 には、これらの commit が含まれています。
バグの修正
- KSP に関するさまざまな問題を修正しました。
バージョン 2.7.0-alpha01
2024 年 5 月 1 日
androidx.room:room-*:2.7.0-alpha01
がリリースされました。バージョン 2.7.0-alpha01 には、これらの commit が含まれています。
新機能
- Kotlin マルチプラットフォーム(KMP)のサポート: このリリースでは、Room がリファクタリングされ、Kotlin マルチプラットフォーム(KMP)ライブラリになりました。まだ作業が残されていますが、このリリースでは、機能の大部分が「共通化」(マルチプラットフォーム化)された Room の新しいバージョンが導入されます。現在サポートされているプラットフォームは、Android、iOS、JVM(パソコン)、ネイティブ Mac、ネイティブ Linux です。新たにサポートされるプラットフォームで不足している機能は、今後の Room リリースで「機能がすべて揃った」状態になります。
Room KMP の使用を開始する方法について詳しくは、Room KMP の公式ドキュメントをご覧ください。
- 処理が KSP 経由で行われる場合、KSP での Kotlin コード生成はデフォルトでオンになっています。KAPT または Java のみのプロジェクトの場合、Room は引き続き Java ソースを生成します。
API の変更
- 生成された
RoomDatabase
実装をインスタンス化するときにリフレクションの使用を回避するために、Room 生成関数で使用することを目的としたラムダ パラメータを取るRoom.databaseBuilder()
のオーバーロードが追加されました。使用例:
Room.databaseBuilder<MyDatabase>(
context = appContext,
name = dbFilePath,
factory = { MyDatabase::class.instantiateImpl() }
)
CoroutineContext
を使用して Room を構成する API がビルダーRoomDatabase.Builder.setQueryCoroutineContext
に追加されました。RoomDatabase
は、setQueryExecutor
を使用するエグゼキュータまたは Coroutine コンテキストのいずれかを使用してのみ構成できます。両方を使用することはできません。SQLite
ドライバで Room を構成するための API が追加されました。RoomDatabase.Builder.setDriver()
SQLite
Driver API の詳細については、SQLite KMP のドキュメントをご覧ください。- ドライバ API から基盤となる
SQLiteConnection
にアクセスするための API(RoomDatabase.useReaderConnection
とRoomDatabase.useWriterConnection
)が追加されました。 - Room 関連の複数のコールバックに、
SupportSQLiteDatabase
ではなくSQLiteConnection
を受け入れるオーバーロード バージョンが追加されました。これらは、KMP プロジェクトに移行するときにオーバーライドすることを目的としています。Android アプリでの Room の使用を共通の KMP モジュールに移行する方法については、移行ガイドをご覧ください。コールバックは次のとおりです。Migration.migrate(SQLiteConnection)
AutoMigrationSpec.onPostMigrate(SQLiteConnection)
RoomDatabase.Callback.onCreate(SQLiteConnection)
RoomDatabase.Callback.onDestructiveMigration(SQLiteConnection)
RoomDatabase.Callback.onOpen(SQLiteConnection)
- KTX アーティファクト
androidx.room:room-ktx
は、すべての API とともにandroidx.room:room-runtime
に統合され、アーティファクトは空になりました。依存関係リストから削除してください。
バージョン 2.6
バージョン 2.6.1
2023 年 11 月 29 日
androidx.room:room-*:2.6.1
がリリースされました。バージョン 2.6.1 に含まれる commit については、こちらをご覧ください。
バグの修正
EntityCursorConverter
の Double 列のデフォルト値が 0.0 ではなく 0 に設定されていた生成コードの問題を解決しました。また、浮動小数点型の列の同様のエッジケースに対する潜在的な修正も含まれています。(Id75f5、b/304584179)PagingSource
読み込みからスローされた例外は、Throwable を含むLoadResult.Error
のLoadStateUpdate
として伝播されるようになりました。このエラー状態は、PagingDataAdapter.loadStateFlow(Views)
またはLazyPagingItems.loadState(Compose)
で確認できます。これは動作の変更を意味します。以前は、読み込みエラーは、読み込みをトリガーした dao メソッドによってスローされる例外としてバブルアップされていました。(I93887、b/302708983)
バージョン 2.6.0
2023 年 10 月 18 日
androidx.room:room-*:2.6.0
がリリースされました。バージョン 2.6.0 に含まれる commit については、こちらをご覧ください。
2.5.0 以降の重要な変更
- Kotlin コード生成(「Kotlin CodeGen」)を有効にするオプションが Room KSP で利用可能になりました。(4297ec0)。Room で Kotlin CodeGen を有効にするには、KSP のプロセッサ オプションに
room.generateKotlin
オプション名を追加します。KSP のプロセッサ オプションを渡す方法の詳細については、KSP のドキュメントをご覧ください。
注: Kotlin CodeGen を使用する場合は、追加の制限が適用されていることに注意してください。Kotlin CodeGen で抽象プロパティを DAO ゲッターまたは DAO クエリとして使用することはできません。代わりに、プロパティ値が不変で、固定された結果が格納されているという誤解を避けるために、関数として書き換える必要があります。また、Room for Kotlin CodeGen で Nullable コレクションの戻り値の型が許可されなくなりました。
警告: Kotlin CodeGen を使用すると、プロジェクトの null 可能性に関する制限が厳しくなる場合があります。Kotlin CodeGen では型引数の null 可能性は重要ですが、Java ではほとんど無視されます。たとえば、戻り値の型が Flow<foo\> で、テーブルが空であるとします。Java CodeGen では問題は発生しませんが、Kotlin CodeGen ではエラーが発生します。これを回避するには、null が生成されることを前提として、Flow<foo?\> を使用する必要があります。</foo?\></foo\>
- Room Gradle プラグインの新しいアーティファクトが ID
androidx.room
で Room に追加されました。これにより、Gradle アノテーション プロセッサ オプションを介してスキーマの入出力を持つことに関する Room の既存の問題が解決されます。詳細については、Room バージョン 2.6.0-alpha02 リリースノートをご覧ください。 - Room エンティティの値クラスが KSP でサポートされるようになりました。(4194095)
- Room で、DAO 関数のネストされた Map 戻り値の型がサポートされるようになりました。(I13f48、203008711)
バージョン 2.6.0-rc01
2023 年 9 月 20 日
androidx.room:room-*:2.6.0-rc01
がリリースされました。バージョン 2.6.0-rc01 に含まれる commit については、こちらをご覧ください。
バージョン 2.6.0-beta01
2023 年 8 月 23 日
androidx.room:room-*:2.6.0-beta01
がリリースされました。バージョン 2.6.0-beta01 に含まれる commit については、こちらをご覧ください。
バグの修正
- アップサート中に
2067 SQLITE_CONSTRAINT_UNIQUE
例外がスローされたときに発生する、アップサート中の特殊なケースのSQLite
例外を処理。アップサート中に更新を実行する必要があります。(If2849、b/243039555)
バージョン 2.6.0-alpha03
2023 年 8 月 9 日
androidx.room:room-*:2.6.0-alpha03
がリリースされました。バージョン 2.6.0-alpha03 に含まれる commit については、こちらをご覧ください。
新機能
API の変更
- 非推奨となった
@MapInfo
に代わる新しい型アノテーションとして@MapColumn
が作成されました。@MapInfo
アノテーションで指定された列名(keyColumnName
、valueColumnName
、またはその両方)ごとに、columnName
のみを使用して@MapColumn
アノテーションを宣言し、DAO 関数の戻り型で参照されている特定の型引数(Map のキーまたは値)にアノテーションを使用する必要があります。これは、@MapColumn
アノテーションが、@MapInfo
のような関数自体ではなく、DAO 関数の戻り値の型内の型引数で直接使用されるためです。詳細については、@MapColumn
のドキュメントをご覧ください。(Ib0305、b/203008711) - API ファイルを更新して、互換性抑制のアノテーションを付けました。(I8e87a、b/287516207)
- Room Gradle プラグイン API が更新され、バリアントごとの構成が常に必要ではなくなりました。つまり、このプラグインは、複数のディレクトリを作成することなく、すべてのバリアントのグローバルなロケーションを受け入れることができるため、スムーズな移行が可能になります。また、プラグインのメリット(再現可能でキャッシュに保存可能なビルド)を維持しながら、フレーバーやビルドタイプのスキーマを手動で構成することもできます。(I09d6f、b/278266663)
バグの修正
QueryInterceptorStatement
の潜在的なメモリリークの脆弱性を修正しました。(I193d1)QueryInterceptorDatabase execSQL()
関数の誤った動作を修正しました。(Iefdc8)
バージョン 2.6.0-alpha02
2023 年 6 月 21 日
androidx.room:room-*:2.6.0-alpha02
がリリースされました。バージョン 2.6.0-alpha02 に含まれる commit については、こちらをご覧ください。
Room Gradle プラグイン
この新しいリリースには、ID androidx.room
の Room Gradle プラグインの新しいアーティファクトが含まれています。これにより、Gradle アノテーション プロセッサ オプションを介してスキーマの入出力を持つことに関する Room の既存の問題が解決されます。Room Gradle プラグインは、自動移行に使用され、コンパイル タスクの出力として生成されるスキーマが、再現可能でキャッシュに保存可能なビルドになるようにプロジェクトを構成します。このプラグインには、ベーススキーマの場所を構成するための DSL が用意されています。
room {
schemaDirectory("$projectDir/schemas/")
}
プラグインは、Room コンパイラとさまざまなコンパイル タスクとそのバックエンド(javac、KAPT、KSP)を構成して、フレーバー フォルダ(schemas/flavorOneDebug/com.package.MyDatabase/1.json
など)にスキーマ ファイルを出力します。通常どおり、これらのファイルは検証と自動移行に使用するためにリポジトリにチェックインされます。アノテーション プロセッサ オプションの代わりにプラグインを使用するように移行する場合は、既存のスキーマ ファイルを、プラグインによって作成された生成されたフレーバー ディレクトリにコピーする必要があります。これは、手動で行う必要がある 1 回限りの移行オペレーションです。developers.android.com のスキーマのドキュメントは、フィードバックに対応し、プラグインが安定した時点で更新される予定です。ぜひお試しください。
API の変更
RoomDatabase.QueryCallback
は、SAM コンバージョンの使用を可能にするために関数インターフェースとして定義されています。(Iab8ea、b/281008549)
バグの修正
- Room ソースを Java から Kotlin に移行した後に Robolectric でデータベースをインスタンス化すると発生する問題を解決。(Ic053c、b/274924903)
バージョン 2.6.0-alpha01
2023 年 3 月 22 日
androidx.room:room-*:2.6.0-alpha01
がリリースされました。バージョン 2.6.0-alpha01 に含まれる commit については、こちらをご覧ください。
新機能
- KSP 用の Room で値クラスをサポート。Room で、エンティティ内の値クラスをサポートできるようになりました。(4194095)
- Room で Kotlin コード生成(または「Kotlin CodeGen」)を有効にできるようになりました(4297ec0)。Room で Kotlin CodeGen を有効にするには、KSP のプロセッサ オプションに
room.generateKotlin
オプション名を追加します。KSP のプロセッサ オプションを渡す方法の詳細については、KSP のドキュメントをご覧ください。
注: Kotlin CodeGen を使用する場合は、追加の制限が適用されていることに注意してください。Kotlin CodeGen で抽象プロパティを DAO ゲッターまたは DAO クエリとして使用することはできません。代わりに、プロパティ値が不変で、固定された結果が格納されているという誤解を避けるために、関数として書き換える必要があります。また、Room for Kotlin CodeGen で Nullable コレクションの戻り値の型が許可されなくなりました。
警告: Kotlin CodeGen を使用すると、プロジェクトの null 可能性に関する制限が厳しくなる場合があります。Kotlin CodeGen では型引数の null 可能性は重要ですが、Java ではほとんど無視されます。たとえば、戻り値の型が Flow<foo\> で、テーブルが空であるとします。Java CodeGen では問題は発生しませんが、Kotlin CodeGen ではエラーが発生します。これを回避するには、null が生成されることを前提として、Flow<foo?\> を使用する必要があります。</foo?\></foo\>
API の変更
- DAO メソッドの戻り値型で null 許容コレクションが無意味に使用されないようにします。(I777dc、b/253271782、b/259426907)
- 無効化トラッカーの変更を出力する Flow を作成する API を追加しました。この API は、データベースの変更に対応する必要があるストリームを作成する場合に便利です。(I8c790、b/252899305)
バグの修正
- Kotlin コード生成で抽象プロパティを DAO ゲッターまたは DAO クエリとして使用できなくなります。代わりに、プロパティ値が不変で、格納された結果が固定されているという誤解を避けるために、関数として書き換える必要があります。(If6a13、b/127483380、b/257967987)
バージョン 2.5.2
バージョン 2.5.2
2023 年 6 月 21 日
androidx.room:room-*:2.5.2
がリリースされました。バージョン 2.5.2 に含まれる commit については、こちらをご覧ください。
バグの修正
- kotlinx-metadata-jvm との非互換性の問題を修正しました。(386d5c)
- Robolectric テストで Room を使用するとエラーがスローされる問題を修正しました。(f79bea、b/274924903)
バージョン 2.5.1
バージョン 2.5.1
2023 年 3 月 22 日
androidx.room:room-*:2.5.1
がリリースされました。バージョン 2.5.1 に含まれる commit については、こちらをご覧ください。
バグの修正
- データベースがすでに開いている場合は、
FrameworkSQLiteHelper
でデータベースの親ディレクトリを確認しない。(5de86b8) - データベースがすでに開いているかどうかを確認する場合は、
isOpenInternal
チェックを使用します。(e91fb35) - Room の
acquireTransactionThread()
でリエントラント ケースの処理が改善されました。(219f98b)。一時停止中のトランザクション中、Room はトランザクション エグゼキュータのスレッドを使用して、そのスレッドでイベントループを開始し、一時停止中のデータベース オペレーションをそのスレッドにディスパッチします。これにより、すべてのオペレーションがトランザクション コルーチン内にカプセル化されます。通常、トランザクション スレッドはトランザクションを開始したスレッドとは異なることが想定されますが、同じ場合もあります。このような再入可能ケースを処理するため、withTransaction()
はリファクタリングされ、制御ジョブに依存しないようになり、代わりにトランザクション スレッドのrunBlocking
内から停止中のトランザクション ブロックを実行します。
バージョン 2.5.0
バージョン 2.5.0
2023 年 2 月 22 日
androidx.room:room-paging-guava:2.5.0
、androidx.room:room-paging-rxjava2:2.5.0
、androidx.room:room-paging-rxjava3:2.5.0
がリリースされました。バージョン 2.5.0 に含まれる commit については、こちらをご覧ください。
バージョン 2.5.0
2023 年 1 月 11 日
androidx.room:room-*:2.5.0
がリリースされました。バージョン 2.5.0 に含まれる commit については、こちらをご覧ください。
2.4.0 以降の重要な変更
room-runtime
ソースはすべて Java から Kotlin に変換されました。Kotlin へのライブラリ変換のためにコードが Kotlin の場合にソースの互換性がなくなる問題が発生する可能性があります。たとえば、既知のソース互換性のない変更として、InvalidationTracker
ではタイプがMutableSet
ではなくSet
のパラメータを設定するためObserver
でonInvalidate()
を宣言することが必要になりました。さらに、特定の getter メソッドが、Kotlin ファイルでプロパティ アクセス構文を必要とするプロパティに変換されました。重大な非互換性エラーが生じた場合は、バグを報告してください。- 新しいショートカット アノテーション
@Upsert
を追加しました。このアノテーションは、一意性の競合がない場合にエンティティを挿入し、競合がある場合はエンティティの更新を試みます。(I7aaab、b/241964353) - Room ページングでのサポートのために新しい room-paging アーティファクト
room-paging-rxjava2
、room-paging-rxjava3
、room-paging-guava
を追加しました。 @MapInfo
で曖昧さ回避のために Key-Value テーブル名を指定するための API を追加しました。(Icc4b5)
バージョン 2.5.0-rc01
2022 年 12 月 7 日
androidx.room:room-*:2.5.0-rc01
がリリースされました。バージョン 2.5.0-rc01 に含まれる commit については、こちらをご覧ください。
- このリリースは
2.5.0-beta02
と同一です。
バージョン 2.5.0-beta02
2022 年 11 月 9 日
androidx.room:room-*:2.5.0-beta02
がリリースされました。バージョン 2.5.0-beta02 に含まれる commit については、こちらをご覧ください。
API の変更
- Java の配列の動作と一致するように、不変(
Array<Any?>
)から反変(Array<out Any?>
)まで、クエリ引数を受け取るさまざまな API を修正しました。(b/253531073)
バージョン 2.5.0-beta01
2022 年 10 月 5 日
androidx.room:room-*:2.5.0-beta01
がリリースされました。バージョン 2.5.0-beta01 に含まれる commit については、こちらをご覧ください。
API の変更
@Upsert
をサポートする最小バージョンを API 16 に制限します。古い API では、主キーの制約の競合を識別できないためです。(I5f67f、b/243039555)
バグの修正
- シャドウ テーブルがスキーマ
.json
ファイルに誤ってエクスポートされた場合に破損する問題を修正しました。(I4f83b、b/246751839)
バージョン 2.5.0-alpha03
2022 年 8 月 24 日
androidx.room:room-*:2.5.0-alpha03
がリリースされました。バージョン 2.5.0-alpha03 に含まれる commit については、こちらをご覧ください。
新機能
- 新しいショートカット アノテーション
@Upsert
を追加しました。このアノテーションは、一意性の競合がない場合にエンティティを挿入し、競合がある場合はエンティティの更新を試みます。(I7aaab、b/241964353)
バグの修正
- 自動移行の外部キー制約の確認の際に、Room が
IllegalStateException
ではなくSQLiteConstraintException
をスローするようになりました。(I328dd) getOpenHelper
、getQueryExecutor
、getTransactionExecutor
のゲッター / プロパティに関する Kotlin ソースの互換性のない変更を修正しました。(Iad0ac)
バージョン 2.5.0-alpha02
2022 年 6 月 1 日
androidx.room:room-*:2.5.0-alpha02
がリリースされました。バージョン 2.5.0-alpha02 に含まれる commit については、こちらをご覧ください。
新機能
- Room ページングでの新しい
room-paging
アーティファクトroom-paging-rxjava2
、room-paging-rxjava3
、room-paging-guava
のサポートを追加しました。(41a1d4、b/203666906)、(eb6098、b/203666906)、(1b9ae4、b/203666906)
API の変更
room-runtime
はすべて Java から Kotlin に変換されました。(If2069、b/206859668)、(Ie4b55、b/206859668)、(I697ee、b/206859668)、(I96c25、b/206859668)注: Kotlin へのライブラリ変換のため、ソースの互換性がなくなる問題が発生するおそれがあります。コードを Kotlin で記述していて、Room の古いバージョンを呼び出す場合は、新しいバージョンでこれらのケースを処理する必要があります。たとえば、既知のソース互換性のない変更として、
InvalidationTracker
ではタイプがMutableSet
ではなくSet
のパラメータを設定するためObserver
でonInvalidate()
を宣言することが必要になりました。@MapInfo
で曖昧さ回避のために Key-Value テーブル名を指定するための API を追加しました。(Icc4b5)- プロパティ ゲッターで
@Ignore
を再度許可するようにソースの互換性の問題を修正しました。(Ifc2fb)
バグの修正
- 重複する列の解決ヒューリスティック アルゴリズム。Room はマルチマップ クエリで曖昧な列の解決を試みるようになりました。これにより、結果データ オブジェクトに正しくマッピングされるよう同じ名前の列を含むテーブルとの JOIN が可能になりました。(I4b444、b/201306012、b/212279118)
バージョン 2.5.0-alpha01
2022 年 2 月 23 日
androidx.room:room-*:2.5.0-alpha01
がリリースされました。バージョン 2.5.0-alpha01 に含まれる commit については、こちらをご覧ください。
API の変更
- Kotlin ソースで Room
@IntDef
の使用が適用されない問題を修正しました。(I75f41、b/217951311) - プロパティ ゲッターで
@Query
を再度許可するようにソースの互換性の問題を修正しました。(I0a09b) - room-common を Java から Kotlin に変換しました。(I69c48、b/206858235)
注: Kotlin へのライブラリ変換中に、一部のプロパティがコンパニオン オブジェクトに移動されたため、ソースの互換性がなくなる問題が発生するおそれがあります。コードを Kotlin で記述していて、Room の古いバージョンを呼び出す場合、新しいバージョンではこれらのプロパティにアクセスする際に「.Companion」サフィックスが必要になります。
- room-migration を Java から Kotlin に変換しました。(I2724b、b/206858622)
room-runtime
内のpaging
関連ファイルを Java から Kotlin に変換しました。(I82fc8、b/206859668)- FrameworkSQLite* レベルでのマルチプロセス ロックと使用のための API を追加し、マルチプロセスの最初のデータベース作成と移行を保護するようにしました。(Ied267、b/193182592)
バグの修正
- Kotlin ソースの内部プロパティのサポートを追加しました。これは Room の軽微な動作変更で、ゲッター / セッターとしてプロパティと一致させるときに関数のソース名を使用するようになります(以前は、内部の関数 / プロパティによって異なる関数の JVM 名を使用していました)。カスタムの
@JvmName
アノテーションを使用してゲッター / セッターをプライベート プロパティと一致させている場合は、更新後に生成されたコードを再確認してください(If6531、b/205289020)
バージョン 2.4.3
バージョン 2.4.3
2022 年 7 月 27 日
androidx.room:room-*:2.4.3
がリリースされました。バージョン 2.4.3 に含まれる commit については、こちらをご覧ください。
バグの修正
- Kotlin 1.7 で Room が suspend 関数を認識しない問題を修正しました(b/236612358)
バージョン 2.4.2
バージョン 2.4.2
2022 年 2 月 23 日
androidx.room:room-*:2.4.2
がリリースされました。バージョン 2.4.2 に含まれる commit については、こちらをご覧ください。
バグの修正
-Xjvm-default=all
またはそれと同等のものを使用したコンパイルによってデフォルト インターフェース メソッドを生成する本文を含む Dao@Transaction
suspend 関数のコードを生成する際の問題を修正しました。(Ia4ce5)- Room が戻り値の型
Array<ByteArray>
のクエリメソッドのコードを生成するバグを修正しました。(If086e、b/213789489)
バージョン 2.4.1
バージョン 2.4.1
2022 年 1 月 12 日
androidx.room:room-*:2.4.1
がリリースされました。バージョン 2.4.1 に含まれる commit については、こちらをご覧ください。
バグの修正
- Kotlin ソースの内部プロパティのサポートを追加しました。これは Room の軽微な動作変更で、ゲッター / セッターとしてプロパティと一致させるときに関数のソース名を使用するようになります(以前は、内部の関数 / プロパティによって異なる関数の JVM 名を使用していました)。カスタムの
@JvmName
アノテーションを使用してゲッター / セッターをプライベート プロパティと一致させている場合は、更新後に生成されたコードを再確認してください(If6531、b/205289020)
バージョン 2.4.0
バージョン 2.4.0
2021 年 12 月 15 日
androidx.room:room-*:2.4.0
がリリースされました。バージョン 2.4.0 に含まれる commit については、こちらをご覧ください。
2.3.0 以降の重要な変更
- 自動移行: スキーマがエクスポートされている間、自動的に移行を生成するための API を Room が提供するようになりました。自動移行の生成が必要であることを Room に通知するには、新しいプロパティ
@Database#autoMigrations
を使用して、自動移行の移行元と移行先のバージョンを宣言できます。テーブルや列の名前の変更や削除に関する追加情報が Room に必要な場合、@AutoMigration
アノテーションでそのような入力を含む仕様クラスを宣言できます。詳しくは、@AutoMigration
のドキュメントをご覧ください。 - 自動移行での依存関係の注入:
@ProvidedAutoMigrationSpec
は、AutoMigrationSpec
が実行時にRoomDatabase.Builder#addAutoMigrationSpec()
を介して提供されることを宣言するための新しい API です。これにより、依存関係の注入フレームワークで複雑な依存関係が必要な場合に、そのような仕様を提供できます。 - 自動移行の移行テストヘルパーのサポート: テスト対象のデータベース クラスを受け取る新しいコンストラクタ API を提供することで自動移行をサポートするように、Room の
MigrationTestHelper
が更新されました。これにより、ヘルパーはrunMigrationsAndValidate
中に同じ方法で自動移行を自動的に追加できます。 - Room ページングのサポート:
androidx.room:room-paging
がリリースされました。これにより、androidx.paging.PagingSource
を返す Room クエリで Paging 3.0 がネイティブにサポートされます。 - リレーショナル クエリ メソッド: Room で、JOIN ステートメントに役立つ、マルチマップを戻り値の型とする
@Dao
メソッドがサポートされるようになりました。サポートされているマルチマップの型は、Map
、SparseArray
、LongSparseArray
と、Guava のImmutableMap
、ImmutableSetMultimap
、ImmutableListMultimap
です。
バージョン 2.4.0-rc01
2021 年 12 月 1 日
androidx.room:room-*:2.4.0-rc01
がリリースされました。バージョン 2.4.0-rc01 に含まれる commit については、こちらをご覧ください。
新機能
- Kotlin 1.6 をサポートするよう、KSP に対する Room の依存関係を
1.6.0-1.0.1
に更新しました。
バージョン 2.4.0-beta02
2021 年 11 月 17 日
androidx.room:room-*:2.4.0-beta02
がリリースされました。バージョン 2.4.0-beta02 に含まれる commit については、こちらをご覧ください。
新機能
- @MapInfo に SparseArray と LongSparseArray のサポートを追加しました。(Ic91a2、b/138910317)
バグの修正
- 型の null 可能性情報を考慮する新しい TypeConverter アナライザを追加しました。この情報は KSP でしか利用できないため、KSP でのみデフォルトでオンになっています。問題が発生する場合は、room.useNullAwareTypeAnalysis=false をアノテーション プロセッサに渡すことでオフにできます。その場合、このフラグは今後に削除される予定であるためバグを報告してください。この新しい TypeConverter アナライザには null チェックでラップする機能があるため、null を受け取らない TypeConverter のみを提供することをおすすめします。なお、アノテーション プロセッサとして KAPT または Java を使用しているユーザーは(KSP とは異なり)型に null 可能性情報がないため影響がありません。(Ia88f9、b/193437407)
- FTS エンティティが ICU トークナイザーの使用を宣言した場合に、Room がコンパイルに失敗し、SQL エラーが発生するバグを修正しました。(I00db9、b/201753224)
- バージョン間で埋め込まれたエンティティに新しい列が追加されるという自動移行の問題を解決しました。(I5fcb1、b/193798291)
- LEFT JOIN クエリでのリレーショナル クエリ メソッドの戻り値の型に関する問題を解決しました。今回の変更により、1 対多のマッピングが存在する場合、無効な値オブジェクトは、カーソル内にない場合にキーに対して返されるコレクションに含まれなくなります。有効な値がない場合、キーは空のコレクションにマッピングされます。(Id5552、b/201946438)
- SQLite キーワードを列名でエスケープできない自動移行の問題を解決しました。(Idbed4、b/197133152)
バージョン 2.4.0-beta01
2021 年 10 月 13 日
androidx.room:room-*:2.4.0-beta01
がリリースされました。バージョン 2.4.0-beta01 に含まれる commit については、こちらをご覧ください。
バグの修正
- 同じ自動移行内の別のテーブルにも同じ名前の新しい列がある場合、自動移行で新しい列が追加されない問題を修正しました。(Ia5db5、b/200818663)
- room-paging によって生成された PagingSource 実装が、以前の
Dispatchers.IO
ではなく、RoomDatabase.Builder
を介して渡されたqueryExecutor
を使用するようになったため、オーバーライドできるようになりました。(Iae259)
バージョン 2.4.0-alpha05
2021 年 9 月 29 日
androidx.room:room-*:2.4.0-alpha05
がリリースされました。バージョン 2.4.0-alpha05 に含まれる commit については、こちらをご覧ください。
新機能
- UUID 用の組み込みの型コンバータを追加しました。(I671e8、b/73132006)
API の変更
デベロッパーが組み込みの Enum および UUID コンバータを無効にできるように、TypeConverter アノテーションに新しいプロパティを追加しました。これらのコンバータはデフォルトでオンになっていますが、特定のスコープまたはデータベース全体で無効にできます。詳しくは、TypeConverter のドキュメントをご覧ください。(36ae9e、b/195413406)
@MapInfo
アノテーションにより、DAO のマルチマップ戻り値型について POJO 以外のキー / 値をサポートします。(I4d704)
マップのキーまたは値の列が単一の列に由来する場合は、@MapInfo
が必要になります。次の例をご覧ください。
@MapInfo(valueColumn = "songCount")
@Query("""
SELECT *, COUNT(mSongId) as songCount
FROM Artist JOIN Song ON Artist.artistName = Song.artist
GROUP BY artistName
""")
fun getArtistAndSongCounts(): Map<Artist, Integer>
- Room で Paging3 を使用する場合は、
room-paging
が必須アーティファクトになります。(Ieaffe)
バグの修正
- マップのキーからの列の ORDER BY 句がクエリに含まれている場合に、マルチマップ クエリの結果が正しく並べ替えられなかった問題を修正しました。(I6b887)
外部からの協力
- @Index でインデックス順序を指定する新しい API を追加しました。Nikita Zhelonkin 氏に感謝いたします。(I033fc)
バージョン 2.4.0-alpha04
2021 年 7 月 21 日
androidx.room:room-*:2.4.0-alpha04
がリリースされました。バージョン 2.4.0-alpha04 に含まれる commit については、こちらをご覧ください。
新機能
Room で、JOIN ステートメントに役立つ、マルチマップを戻り値の型とする
@Dao
メソッドがサポートされるようになりました。サポートされているマルチマップの型は、Map
と、Guava のImmutableMap
、ImmutableSetMultimap
、ImmutableListMultimap
です。以下に、マルチマップ クエリの例を示します。
1 対 1 関係のマップ
@Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId") fun getSongAndArtist(): Map<Song, Artist>
1 対多関係のマップ(標準のマルチマップ)
@Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId") fun getArtistAndAlbums(): Map<Artist, List<Album>>
マルチマップの結果は、サポートされている非同期の戻り値の型(
LiveData
、Rx のObservable
、コルーチンFlow
など)でラップすることもできます。
Room ページング
androidx.room:room-paging
がリリースされました。これにより、androidx.paging.PagingSource
を返す Room クエリで Paging 3.0 がネイティブにサポートされます。@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun loadUsers(): PagingSource<Int, User> }
このアーティファクトは、Room によって生成された
androidx.paging.PagingSource
の実装を、Paging 3.0 API 上に構築された実装に置き換えます。新しい PagingSource の実装ではキーの解析方法が異なっているため、Room の PagingSource に手動で指定するキーは、Pager のコンストラクタで渡される initialKey を含め、この動作変更に対応する必要があります。ページの読み込みはKey
から開始されます(Key
は最初に読み込まれるアイテムとなります)。これは、LoadParams.Refresh.Key
がユーザーのスクロール位置として扱われ、キーの前後でアイテムがロードされる既存の動作とは異なります。このアーティファクトはオプションです。オプトアウトすると、Room 2.3 で導入された Paging 3.0 の既存のサポートにフォールバックします。ただし、今後のリリースで Paging 3.0 で Room を使用している場合は、このアーティファクトはオプションではなくなります。オプトインするには、新しい room-paging アーティファクトをクラスパスに追加してください。Gradle を使用している場合は、次のスニペットを build.gradle に追加します。
dependency { implementation("androidx.room:room-paging:2.4.0-alpha04") }
バグの修正
- 外部キー違反の処理に関する自動移行で問題を修正しました。(b/190113935)
バージョン 2.4.0-alpha03
2021 年 6 月 16 日
androidx.room:room-*:2.4.0-alpha03
がリリースされました。バージョン 2.4.0-alpha03 に含まれる commit については、こちらをご覧ください。
API の変更
- Room の
MigrationTestHelper
を更新し、テスト対象のデータベース クラスを受け取る新しいコンストラクタ API を提供することにより、自動移行をサポートするようにしました。これにより、ヘルパーはrunMigrationsAndValidate
中に同じ方法で自動移行を自動的に追加できます。
バグの修正
Room の SQLite ネイティブ ライブラリに関する問題を修正し、Apple の M1 チップをサポートするようにしました。(b/174695268)
@Transaction 関数の戻り値の型が Flow だったときに Room がエラーを表示しない問題を修正しました(I56ddd、b/190075899)
インデックスに関連する自動移行の問題を修正しました。(b/177673291)
依存関係の更新
- Room の KSP サポートが KSP
1.5.10-1.0.0-beta01
に依存するようになりました。(1ecb11、b/160322705)
バージョン 2.4.0-alpha02
2021 年 5 月 5 日
androidx.room:room-*:2.4.0-alpha02
がリリースされました。バージョン 2.4.0-alpha02 に含まれる commit については、こちらをご覧ください。
API の変更
@ProvidedAutoMigrationSpec
は、AutoMigrationSpec
が実行時にRoomDatabase.Builder#addAutoMigrationSpec()
を介して提供されることを宣言するための新しい API です。これにより、依存関係の注入フレームワークで複雑な依存関係が必要な場合に、そのような仕様を提供できます。
バグの修正
@DatabaseView
が正しく再作成されない自動移行の問題を修正しました。
外部からの協力
- Room の
JournalMode.TRUNCATE
で、たまにInvalidationTracker
コールバックの呼び出しが無効になったり、遅すぎたり、またはまったく発生しなかったりする問題を修正しました。Uli Bubenheimer | bubenheimer@users.noreply.github.com
に感謝いたします(b/154040286)
バージョン 2.4.0-alpha01
2021 年 4 月 21 日
androidx.room:room-*:2.4.0-alpha01
がリリースされました。バージョン 2.4.0-alpha01 に含まれる commit については、こちらをご覧ください。
新機能
- 自動移行: スキーマがエクスポートされている間、自動的に移行を生成するための API を Room が提供するようになりました。自動移行の生成が必要であることを Room に通知するには、新しいプロパティ
@Database#autoMigrations
を使用して、自動移行の移行元と移行先のバージョンを宣言できます。テーブルや列の名前の変更や削除に関する追加情報が Room に必要な場合、@AutoMigration
アノテーションでそのような入力を含む仕様クラスを宣言できます。詳しくは、@AutoMigration
のドキュメントをご覧ください。
バグの修正
defaultValue
に余分なかっこが含まれる場合、Room のスキーマ検証によって正しく検証されない問題を修正しました。(b/182284899)
バージョン 2.3.0
バージョン 2.3.0
2021 年 4 月 21 日
androidx.room:room-*:2.3.0
がリリースされました。バージョン 2.3.0 に含まれる commit については、こちらをご覧ください。
2.2.0 以降の重要な変更
- 組み込みの列挙型のサポート: 型コンバータが提供されなかった場合、Room はデフォルトで列挙型から文字列型へ(およびその逆)の型コンバータを使用するようになりました。列挙型用の型コンバータがすでに存在する場合、Room はデフォルトの型コンバータよりそちらを優先的に使用します。
- クエリ コールバック: Room は、クエリを実行する直前に利用できる一般的なコールバック API RoomDatabase.QueryCallback を提供するようになりました。これは、デバッグビルドのロギングに役立ちます。このコールバックは
RoomDatabase.Builder#setQueryCallback()
を介して設定できます。 - あらかじめパッケージ化されたデータベースへの対応: Room に、入力ストリームから読み込まれた、あらかじめパッケージ化されたデータベースを使用してデータベースを作成するための API が追加されました。これにより、あらかじめパッケージ化されたデータベースが gzip で圧縮されている場合などに対応できます。
- 型コンバータの提供: Room に、アプリが初期化を制御できるように、型コンバータのインスタンスを提供するための API が追加されました。Room に提供される型コンバータにマークを付けるには、新しいアノテーション @ProvidedTypeConverter を使用します。
- RxJava3 のサポート: Room で RxJava3 の型がサポートされるようになりました。RxJava2 と同様に、戻り値の型が Flowable、Single、Maybe、Completable の DAO メソッドを宣言できます。また、RxJava3 をサポートする新しいアーティファクト
androidx.room:room-rxjava3
を使用できます。 - Paging 3.0 のサポート: 戻り値の型が
androidx.paging.PagingSource
である、@Query
アノテーション付きメソッドの実装の生成が Room でサポートされます。
バージョン 2.3.0-rc01
2021 年 3 月 24 日
androidx.room:room-*:2.3.0-rc01
がリリースされました。バージョン 2.3.0-rc01 に含まれる commit については、こちらをご覧ください。
バグの修正
- Room が作成したコルーチンの Flow クエリが停止されている
withTransaction
ブロックで消費されない問題を修正しました(I797bf)。
バージョン 2.3.0-beta03
2021 年 3 月 10 日
androidx.room:room-*:2.3.0-beta03
がリリースされました。バージョン 2.3.0-beta03 に含まれる commit については、こちらをご覧ください。
新機能
- KSP の増分コンパイルのサポートを追加しました。(I031c1、b/176453350)
バグの修正
- メインスレッドで PagingSource を作成すると ANR が発生するバグを修正しました。(I42b74、b/181221318)
@ExperimentalRoomApi
の公開設定がパッケージ プライベートではなく一般公開になる問題を修正しました。(b/181356119)
外部からの協力
- Room では、
@SkipQueryVerification
アノテーションが付いているときに、@Query
アノテーション付きの DAO メソッドで POJO 戻り値の型が受け入れられるようになりました。Room は、@RawQuery
アノテーション付きの DAO メソッドの場合と同じように、ベスト エフォートを行ってクエリの結果を POJO 戻り値の型に変換します。「Markus Riegel | hey@marcorei.com」に感謝いたします。(I45acb)
バージョン 2.3.0-beta02
2021 年 2 月 18 日
androidx.room:room-*:2.3.0-beta02
がリリースされました。バージョン 2.3.0-beta02 に含まれる commit については、こちらをご覧ください。
新機能
Room に Kotlin Symbol Processing KSP の試験運用版でのサポートが追加されました。
KSP は Kotlin コンパイラでネイティブにアノテーション プロセッサを実行する KAPT に置き換わるもので、ビルド時間を大幅に短縮します。
KSP で Room を使用するには、KSP Gradle プラグインを適用し、ビルドファイル内の
kapt
構成をksp
に置き換えます。たとえば、kapt 'androidx.room:room-compiler:2.3.0-beta02'
の代わりにksp 'androidx.room:room-compiler:2.3.0-beta02'
を使用します。詳しくは、KSP のドキュメントをご覧ください。なお、KSP は試験運用中のため、実稼働コードには KAPT を引き続き使用することをおすすめします。ビルド時間の短縮は、KAPT を使用するプロセッサが他にない場合にのみ適用されます。既知の問題については b/160322705 をご覧ください。
バージョン 2.3.0-beta01
2021 年 1 月 27 日
androidx.room:room-*:2.3.0-beta01
がリリースされました。バージョン 2.3.0-beta01 に含まれる commit については、こちらをご覧ください。
新機能
- 自動クローズ可能なデータベース: 一定の期間アクセスされなかったデータベースをクローズする機能が Room に導入されました。これは試験運用版の機能であり、有効にするには
RoomDatabase.Builder#setAutoCloseTimeout()
を呼び出します。この機能は、複数のデータベースを使用するアプリで役立ちます。
バグの修正
- 異なる競合戦略が定義された複数の
@Update
または@Delete
メソッドを使用する Dao メソッドが、そのうちの 1 つの戦略のみを使用してコードを生成し、定義された戦略を結果的に無視する問題を修正しました。(/I0b90d、b/176138543)
バージョン 2.3.0-alpha04
2020 年 12 月 16 日
androidx.room:room-*:2.3.0-alpha04
がリリースされました。バージョン 2.3.0-alpha04 に含まれる commit については、こちらをご覧ください。
新機能
- Room は、クエリを実行する直前に利用できる一般的なコールバック API
RoomDatabase.QueryCallback
を提供するようになりました。これは、デバッグビルドのロギングに役立ちます。このコールバックはRoomDatabase.Builder#setQueryCallback()
を介して設定できます。(Iaa513、b/174478034、b/74877608) - 型コンバータが提供されなかった場合、Room はデフォルトで列挙型から文字列型へ(およびその逆)の型コンバータを使用するようになりました。列挙型用の型コンバータがすでに存在する場合、Room はデフォルトの型コンバータよりそちらを優先的に使用します。(b/73132006)
既知の問題
- 列挙型に対する読み取り用として一方向の型コンバータがすでに存在する場合、Room は組み込みの文字列型から列挙型への型コンバータを(使用すべきでなくても)誤って使用することがあります。これは既知の問題であり、型コンバータを双方向にすることで解決できます。b/175707691 を参照してください。
バグの修正
- JDK の新しいバージョンで Room が増分アノテーション処理を誤って無効にする問題を修正しました。(b/171387388)
- 複数のクラスローダが使用されているときに Room が生成されたクラスを検出する問題を修正しました。修正にご協力いただいた「Serendipity | 892449346@qq.com」に感謝いたします。(b/170141113)
- Kotlin
@Dao
に汎用型が JVM のプリミティブである基本クラスが存在する場合に、Room が誤ったコードを生成する問題を修正しました。(b/160258066)
外部からの協力
- WAL モードが有効で API が 16 以上の場合、Room はデフォルトで
beginTransactionNonExclusive
を使用するようになりました。「Ahmed I. Khalil | ahmedibrahimkhali@gmail.com」に感謝いたします。(b/126258791)
バージョン 2.3.0-alpha03
2020 年 10 月 14 日
androidx.room:room-*:2.3.0-alpha03
がリリースされました。バージョン 2.3.0-alpha03 に含まれる commit については、こちらをご覧ください。
新機能
Room に、アプリが初期化を制御できるように、型コンバータのインスタンスを提供するための API が追加されました。Room に提供される型コンバータにマークを付けるには、新しいアノテーション
@ProvidedTypeConverter
を使用します。「mzgreen yairobbe@gmail.com」に感謝いたします。(Ie4fa5、b/121067210)Room に、入力ストリームから読み込まれた、あらかじめパッケージ化されたデータベースを使用してデータベースを作成するための API が追加されました。これにより、あらかじめパッケージ化されたデータベースが gzip で圧縮されている場合などに対応できます。「Ahmed El-Helw ahmedre@gmail.com」に感謝いたします。(3e6792、b/146911060)
API の変更
欠落しているターゲットを
@ForeignKey
アノテーションに追加しました。これにより、@Entity
アノテーションの外部での使用を防ぐことができます。(Iced1e)RoomDatabase.java
のフィールドmCallbacks
を非表示にしました。(d576cb、b/76109329)
バグの修正
TypeConverter に関するドキュメントを更新し、TypeConverter を使用できるのは、列 / フィールドを変換する場合のみであり、行の変換には使用できないことを明確にしました。(I07c56、b/77307836)
DaoProcessor を更新し、Kotlin の「プリミティブ」を持つ汎用的なスーパー型を使用して Dao のコンパイラ エラーを修正しました。(Ice6bb、b/160258066)
add / remove オブザーバー メソッドに関するドキュメントを更新し、スレッド化について明確にしました。(Ifd1d9、b/153948821)
rowid 列を宣言した FTS テーブルを Room が誤って検証する問題を修正しました。(d62ebc、b/145858914)
外部からの協力
トルコ語に関連する大文字 / 小文字のロケールの問題を修正(5746e3)、b/68159494
Android Lollipop の問題を回避するため、
RoomDatabase
内のConcurrentHashMap
をCollections.synchronizedMap()
に変更しました。(d1cfc7、b/162431855)あらかじめパッケージ化された DB をコピーする場合のために、onOpenPrepackagedDatabase コールバックを追加しました。(I1ba74、b/148934423)
バージョン 2.3.0-alpha02
2020 年 7 月 22 日
androidx.room:room-*:2.3.0-alpha02
がリリースされました。バージョン 2.3.0-alpha02 に含まれる commit については、こちらをご覧ください。
新機能
- RxJava3 のサポート: Room で RxJava3 の型がサポートされるようになりました。RxJava2 と同様に、戻り値の型が Flowable、Single、Maybe、Completable の DAO メソッドを宣言できます。また、RxJava3 をサポートする新しいアーティファクト
androidx.room:room-rxjava3
を使用できます。(b/152427884)
API の変更
- Kotlin の Object クラスで
@TypeConverter
の宣言がサポートされるようになりました。(b/151110764) - Room の増分アノテーション処理オプションがデフォルトでオンになりました。(b/112110217)
バージョン 2.3.0-alpha01
2020 年 6 月 10 日
androidx.room:room-*:2.3.0-alpha01
がリリースされました。バージョン 2.3.0-alpha01 に含まれる commit については、こちらをご覧ください。
新機能
Paging 3.0 のサポート: 戻り値の型が
androidx.paging.PagingSource
である、@Query
アノテーション付きメソッドの実装の生成が Room でサポートされます。@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun pagingSource(): PagingSource<Int, User> }
API の変更
@RewriteQueriesToDropUnusedColumns
は、結果内の未使用の列が削除されるように Room がクエリの「*」投影を書き換える、便利な新しいアノテーションです。- プロセッサ オプション
room.expandProjection
のサポートが終了しました。スター投影を使用する Room 最適化クエリの代わりとして、@RewriteQueriesToDropUnusedColumns
を使用してください。なお@RewriteQueriesToDropUnusedColumns
は、@Embedded
フィールドを含む戻り値の型に関して提供される列競合ソリューションroom.expandProjection
を置き換えるものではありません。
バグの修正
- 増分アノテーション プロセッサを有効にするために使用される JDK バージョンを Room が正しく検出しないバグを修正しました。「Blaz Solar(me@blaz.solar)」に感謝いたします。(b/155215201)
- ANTLR も使用する他のプロセッサとのバージョン競合を避けるために、Room はアノテーション プロセッサで ANTLR 依存関係を埋め込むようになりました。(b/150106190)
バージョン 2.2.6
バージョン 2.2.6
2020 年 12 月 16 日
androidx.room:room-*:2.2.6
がリリースされました。バージョン 2.2.6 に含まれる commit については、こちらをご覧ください。
バグの修正
- JDK の新しいバージョンで Room が増分アノテーション処理を誤って無効にする問題を修正しました。(b/171387388)
バージョン 2.2.5
バージョン 2.2.5
2020 年 3 月 18 日
androidx.room:room-*:2.2.5
がリリースされました。バージョン 2.2.5 に含まれる commit については、こちらをご覧ください。
バグの修正
MultiInstanceInvalidationService
を directBootAware にします。「Mygod contact-git@mygod.be」 に感謝いたします。(b/148240967)- 複数インスタンスの無効化が有効で、データベースに FTS エンティティが含まれている場合にクラッシュするバグを修正しました。(b/148969394)
- Room アノテーション プロセッサで SQLite ネイティブ ライブラリを読み込むときに、並列コンパイルが原因でコンパイラがクラッシュする問題を修正しました。(b/146217083)
バージョン 2.2.4
バージョン 2.2.4
2020 年 2 月 19 日
androidx.room:room-common:2.2.4
、androidx.room:room-compiler:2.2.4
、androidx.room:room-guava:2.2.4
、androidx.room:room-ktx:2.2.4
、androidx.room:room-migration:2.2.4
、androidx.room:room-runtime:2.2.4
、androidx.room:room-rxjava2:2.2.4
、androidx.room:room-testing:2.2.4
がリリースされました。バージョン 2.2.4 に含まれる commit については、こちらをご覧ください。
バグの修正
- トランザクションが実際に開始される前にコルーチンがすぐにキャンセルされた場合にデッドロックになる、トランザクションの停止に関する問題を修正しました。(b/148181325)
- JDK 9 でのビルド時に @Generated が誤って使用される問題を修正しました。(b/146538330)
- Kotlin の DAO インターフェースに具象関数がある場合に Room が誤ったコードを生成する問題を修正しました。(b/146825845)
バージョン 2.2.3
バージョン 2.2.3
2019 年 12 月 18 日
androidx.room:room-*:2.2.3
がリリースされました。バージョン 2.2.3 に含まれる commit については、こちらをご覧ください。
バグの修正
- 移行を行っておらず、スキーマにインデックスを持つレガシー ハッシュを含むデータベースを、Room が検証できないバグを修正しました。(b/139306173)
バージョン 2.2.2
バージョン 2.2.2
2019 年 11 月 20 日
androidx.room:room-*:2.2.2
がリリースされました。バージョン 2.2.2 に含まれる commit については、こちらをご覧ください。
バグの修正
- 999 行を超える 1 対 1 の関係を収集すると Room が null に関連するアイテムを返すというバグを修正しました(b/143105450)
バージョン 2.2.1
バージョン 2.2.1
2019 年 10 月 23 日
androidx.room:room-*:2.2.1
がリリースされました。バージョン 2.2.1 に含まれる commit については、こちらをご覧ください。
バグの修正
- コンパイラ オプション
expandProjection
がオンのときのCURSOR_MISMATCH
に関して Room が誤って警告するバグを修正しました。(b/140759491) - コンパイル中のクエリの確認に使用されるネイティブ ライブラリが見つからない場合の処理を再試行するメカニズムを追加しました。
バージョン 2.2.0
バージョン 2.2.0
2019 年 10 月 9 日
androidx.room:room-*:2.2.0
がリリースされました。バージョン 2.2.0 に含まれる commit については、こちらをご覧ください。
バージョン 2.1.0 以降の重要な変更点
- あらかじめパッケージ化されたデータベース: すでにデータが設定されているデータベース ファイルを指定して
RoomDatabase
を作成するために、RoomDatabase.Builder
の 2 つの新しい API を利用できるようになりました。createFromAsset()
は、事前に設定されたデータベース ファイルが APK のアセット フォルダにある場合に使用し、createFromFile()
は、ファイルが任意の場所にある場合に使用します。これらの API を使用すると破壊的な移行の動作が変更されるため、フォールバック移行中に、Room は、事前に設定されたデータベースがある場合はそれを再コピーしようとします。そうでない場合は、フォールバックして単にすべてのテーブルを削除し、再作成します。b/62185732 - スキーマのデフォルト値: 列のデフォルト値の指定に使用できる新しいプロパティ
defaultValue
が@ColumnInfo
に追加されました。デフォルト値はデータベース スキーマの一部であり、指定されている場合は移行中に検証されます。b/64088772 - 多対多の関係: 新しいアノテーション
@Junction
を受け取る新しいプロパティassociateBy
が@Relation
に追加されました。ジャンクション テーブル(結合テーブルとも呼ばれます)を介して満たす必要がある関係の宣言に使用します。 b/69201917 - 1 対 1 の関係:
List
型またはSet
型の、@Relation
アノテーションが付けられた POJO フィールドの制限が解除され、実質的に単一値の関係を表現できるようになりました。 b/62905145 - ターゲット エンティティ: DAO アノテーション
@Insert
、@Update
、@Delete
に新しいプロパティtargetEntity
が追加され、DAO メソッドの対象として想定されたターゲット テーブルを指定できるようになりました。これにより、これらの DAO メソッドのパラメータを、部分的なエンティティとして解釈される任意の POJO にできます。実際面では、これにより部分的な挿入、削除、更新が可能になります。b/127549506 - コルーチンの Flow:
@Query
DAO メソッドの戻り値の型がFlow<T>
になりました。クエリ内の監視テーブルが無効になった場合、返された Flow は新しい値のセットを再出力します。戻り値の型をChannel<T>
として DAO 関数を宣言するとエラーになります。代わりに、Room ではFlow
を使用してから、近隣関数を使用してFlow
をChannel
に変換することをおすすめします。b/130428884 - Gradle 増分アノテーション プロセッサ: Room が Gradle 分離アノテーション プロセッサになりました。プロセッサ オプション
room.incremental
を介して増分機能を有効にできます。詳しくは、Room のコンパイラ オプションに関する説明をご覧ください。問題が発生した場合は、こちらでバグを報告してください。今後の安定版では、増分機能をデフォルトで有効にする予定です。b/112110217 - 展開投影: 新しい試験運用版のコンパイラ オプション
room.expandProjection
が追加されました。これにより Room は、戻り値の型の POJO の列のみを含むようにスター投影でクエリを書き換えます。たとえば@Query("SELECT * FROM Song")
を指定した DAO メソッドの場合、フィールドが 2 つだけのSongIdAndTitle
という名前の POJO を返します。次に、Room はクエリをSELECT id, title FROM Song
に書き換えて、戻り値の型を満たす列の最小のセットが読み込まれるようにします。これにより、返される POJO の型のどのフィールドとも一致しない余分な列をクエリが返すときに表示されるCURSOR_MISMATCH
警告が、実質的になくなります。
バージョン 2.2.0-rc01
2019 年 9 月 5 日
androidx.room:room:2.2.0-rc01
がリリースされました。このバージョンに含まれる commit については、こちらをご覧ください。
Room 2.2.0-beta01
から公開された変更はありません。
バージョン 2.2.0-beta01
2019 年 8 月 22 日
androidx.room:room-*:2.2.0-beta01
がリリースされました。このバージョンに含まれる commit については、こちらをご覧ください。
バグの修正
- コルーチンの Flow クエリが一定時間後に新しい値の再出力を停止するバグを修正しました。(b/139175786)
- Room 1.0 以後移行されていないデータベースを開いているときに Room が以前のスキーマ ハッシュコードを受け入れず、無効なスキーマが原因でランタイム クラッシュが発生するバグを修正しました。(b/139306173)
バージョン 2.2.0-alpha02
2019 年 8 月 7 日
androidx.room:room-*:2.2.0-alpha02
がリリースされました。このバージョンに含まれる commit については、こちらをご覧ください。
新機能
- コルーチンの Flow:
@Query
DAO メソッドの戻り値の型がFlow<T>
になりました。クエリ内の監視テーブルが無効になった場合、返された Flow は新しい値のセットを再出力します。戻り値の型をChannel<T>
として DAO 関数を宣言するとエラーになります。代わりに、Room ではFlow
を使用してから、近隣関数を使用してFlow
をChannel
に変換することをおすすめします。b/130428884 - 展開投影: 新しい試験運用版のコンパイラ オプション
room.expandProjection
が追加されました。これにより Room は、戻り値の型の POJO の列のみを含むようにスター投影でクエリを書き換えます。たとえば@Query("SELECT * FROM Song")
を指定した DAO メソッドの場合、フィールドが 2 つだけのSongIdAndTitle
という名前の POJO を返します。次に、Room はクエリをSELECT id, title FROM Song
に書き換えて、戻り値の型を満たす列の最小のセットが読み込まれるようにします。これにより、返される POJO の型のどのフィールドとも一致しない余分な列をクエリが返すときに表示されるCURSOR_MISMATCH
警告が、実質的になくなります。 onDestructiveMigrate
は、Room がデータベースを破壊的に移行するときのためにRoomDatabase.Callback
に追加された新しいコールバック API です。b/79962330
バグの修正
- フィールドが保護されている場合に、Room がメソッドをフィールド セッターとして使用して誤ったコードを生成するバグを修正しました。b/136194628
- 複数インスタンスの無効化が有効で、無効化サービスが強制終了されたときに、InvalidationTracker が 2 番目のプロセスで NPE をスローするバグを修正しました。 b/137454915
@RawQuery
アノテーション付きの継承された suspend 関数の戻り値の型を Room が正しく識別しないバグを修正しました。b/137878827- 関連キーが BLOB 型の場合に生成される
@Relation
のコードを更新して、同等のByteBuffer
を使用するようにしました。 b/137881998 @Insert
、@Update
、@Delete
の部分的なエンティティ パラメータとして使用される POJO にセッターが見つからないというエラーが Room で発生するバグを修正しました。b/138664463- 一部の DAO メソッドでエンティティ クラスが使用される場合に、
@Entity
を介して無視される列のゲッターとセッターが見つからないというエラーが Room で発生するバグを修正しました。 b/138238182 - パラメータを再利用してクエリを実行すると、Room が名前付きバインディング引数を位置引数に正しく変換せず、ランタイム例外が発生するバグを修正しました。 b/137254857
バージョン 2.2.0-alpha01
2019 年 7 月 10 日
新機能
- あらかじめパッケージ化されたデータベース: すでにデータが設定されているデータベース ファイルを指定して
RoomDatabase
を作成するために、RoomDatabase.Builder
の 2 つの新しい API を利用できるようになりました。createFromAsset()
は、事前に設定されたデータベース ファイルが APK のアセット フォルダにある場合に使用し、createFromFile()
は、ファイルが任意の場所にある場合に使用します。これらの API を使用すると破壊的な移行の動作が変更されるため、フォールバック移行中に、Room は、事前に設定されたデータベースがある場合はそれを再コピーしようとします。そうでない場合は、フォールバックして単にすべてのテーブルを削除し、再作成します。b/62185732 - スキーマのデフォルト値: 列のデフォルト値の指定に使用できる新しいプロパティ
defaultValue
が@ColumnInfo
に追加されました。デフォルト値はデータベース スキーマの一部であり、指定されている場合は移行中に検証されます。b/64088772注:
ALTER TABLE x ADD COLUMN y INTEGER NOTNULL DEFAULT z
によって追加されたものなど、すでにデータベース スキーマにデフォルト値があり、@ColumnInfo
を介して同じ列にデフォルト値を定義する場合、不明なデフォルト値を検証するために移行が必要になることがあります。詳しくは、Room の移行に関する説明をご覧ください。 - 多対多の関係: 新しいアノテーション
@Junction
を受け取る新しいプロパティassociateBy
が@Relation
に追加されました。ジャンクション テーブル(結合テーブルとも呼ばれます)を介して満たす必要がある関係の宣言に使用します。 b/69201917 - 1 対 1 の関係:
List
型またはSet
型の、@Relation
アノテーションが付けられた POJO フィールドの制限が解除され、実質的に単一値の関係を表現できるようになりました。 b/62905145 - ターゲット エンティティ: DAO アノテーション
@Insert
、@Update
、@Delete
に新しいプロパティtargetEntity
が追加され、DAO メソッドの対象として想定されたターゲット テーブルを指定できるようになりました。これにより、これらの DAO メソッドのパラメータを、部分的なエンティティとして解釈される任意の POJO にできます。実際面では、これにより部分的な挿入、削除、更新が可能になります。b/127549506 - Gradle 増分アノテーション プロセッサ: Room が Gradle 分離アノテーション プロセッサになりました。プロセッサ オプション
room.incremental
を介して増分機能を有効にできます。詳しくは、Room のコンパイラ オプションに関する説明をご覧ください。問題が発生した場合は、こちらでバグを報告してください。今後の安定版では、増分機能をデフォルトで有効にする予定です。b/112110217
バグの修正
- クエリの完了前にクエリの Rx ストリームが破棄された場合に、Room が
EmptySetResultException
をグローバル エラーハンドラに伝搬しなくなりました。 b/130257475 @RawQuery
アノテーションが付けられた suspend DAO 関数に戻り値の型がない場合に、Room が誤ったエラー メッセージを表示するバグを修正しました。 b/134303897- Room は raw 型の DAO アダプターを生成しなくなりました。 b/135747255
バージョン 2.1.0
バージョン 2.1.0
2019 年 6 月 13 日
Room 2.1.0 がリリースされました。2.1.0-rc01
からの変更はありません。このバージョンに含まれる commit については、こちらをご覧ください。
2.0.0 以降の重要な変更
- FTS: FTS3 または FTS4 マッピング テーブルを含むエンティティが Room でサポートされるようになりました。
@Entity
アノテーションが付与されたクラスでは、@Fts3
または@Fts4
のアノテーションを追加で使用することにより、全文検索のマッピング テーブルを含むクラスを宣言できるようになりました。アノテーションのメソッドを介して FTS オプションを使用することで、さらにカスタマイズできるようになります。 - ビュー: Room で
@DatabaseView
アノテーションを使用することにより、クラスをストアドクエリ(ビューとも呼ばれます)として宣言できるようになりました。 - コルーチン: DAO メソッドを suspend 関数として使用できるようになりました。この機能を利用するには、依存関係に
room-ktx
を含めます。ktx アーティファクトは、コルーチン内でデータベース トランザクションを実行するための拡張関数RoomDatabase.withTransaction
も提供します。 - AutoValue: Room で、AutoValue アノテーションが付与されたクラスをエンティティや POJO として宣言できるようになりました。AutoValue アノテーションが付与されたクラスの抽象メソッドで、Room のアノテーションである
@PrimaryKey
、@ColumnInfo
、@Embedded
、@Relation
を宣言できるようになりました。これらのアノテーションは@CopyAnnotations
とともに使用して、Room が正しく認識できるようにする必要もあります。 - 非同期の追加サポート:
@Insert
、@Delete
、または@Update
のアノテーションが付けられた DAO メソッドと、INSERT
、DELETE
、またはUPDATE
のステートメントを含む@Query
は、Rx の戻り値の型Completable
、Single
、Maybe
と、Guava の戻り値の型ListenableFuture
をサポートするようになり、suspend 関数にもできるようになりました。 enableMultiInstanceInvalidation
:RoomDatabase.Builder
の新しい API です。この API では、1 つのデータベース ファイルで RoomDatabase の複数のインスタンスを無効にできます。fallbackToDestructiveMigrationOnDowngrade
:RoomDatabase.Builder
の新しい API です。この API は、ダウングレードが発生した場合にデータベースを自動的に再作成します。ignoredColumns
:@Entity
アノテーションの新しい API です。この API を使用すると、無視するフィールドをフィールド名のリストで指定できます。- データクラスに含まれる Kotlin の基本コンストラクタが Room で適切に使用されるようになり、プロパティを
vars
として宣言する必要がなくなりました。
バージョン 2.1.0-rc01
2019 年 5 月 29 日
バグの修正
- temp_store 構成がすでにセットアップされているために発生する可能性のある Room の初期化エラーを修正しました。 b/132602198
- SQLite 3.27.0 以上のユーザーに対する、二重引用符の使用に関する警告を修正しました。 b/131712640
- 複数の無効化チェックが並行して行われると InvalidationTracker がクラッシュするバグを修正しました。 b/133457594
バージョン 2.1.0-beta01
2019 年 5 月 7 日
androidx.room 2.1.0-beta01
がリリースされました。2.1.0-alpha07 からの変更はありません。このバージョンに含まれる commit については、こちらをご覧ください。
バージョン 2.1.0-alpha07
2019 年 4 月 25 日
API / 動作の変更
- 拡張関数
RoomDatabase.withTransaction
が変更され、CoroutineScope
をレシーバとする関数ブロックを使用しなくなりました。これにより、トランザクション ブロックでの処理を同時実行するために必要な追加のcoroutineScope { }
ラッパーがスキップされなくなります。
バグの修正
- コレクション型のパラメータを含む Kotlin DAO 関数について Room が適切な TypeConverter を見つけられないバグを修正しました。 b/122066791
バージョン 2.1.0-alpha06
2019 年 3 月 22 日
API / 動作の変更
- Room がデータベース トランザクションの実行に複数のスレッドを使用しないように、非同期トランザクション クエリがシリアル化されました。
RoomDatabase.Builder.setTransactionExecutor(Executor)
が追加されて、トランザクションに使用するエグゼキュータを設定できるようになりました。 RoomDatabase.runInTransaction(Callable)
は、チェックされた例外を RuntimeExceptions にラップしなくなりました。 b/128623748
バグの修正
- コンテンツ テーブルと外部コンテンツ FTS テーブルの両方にオブザーバーが追加された場合に、無効化トラッカーがコンテンツ テーブルの監視を停止するバグを修正しました。 b/128508917
- Room の SQLite 文法を SQLite 3.24.0 と一致させるように更新しました。 b/110883668
バージョン 2.1.0-alpha05
2019 年 3 月 13 日
新機能
- 拡張関数
RoomDatabase.withTransaction
を使用すると、コルーチン内でデータベース トランザクションを安全に実行できます。Room の拡張関数とコルーチンのサポートは、room-ktx
アーティファクトで利用できます。 @Transaction
アノテーションが付けられた非抽象 DAO メソッドを suspend 関数にできるようになりました。b/120241587
API / 動作の変更
- アーティファクト
room-coroutines
の名前を、他の androidx アーティファクトと同じ命名規則に従ってroom-ktx
に変更しました。 runInTransaction
とroom-ktx
拡張関数withTransaction
を優先して、RoomDatabase
のbeginTransaction
、setTransactionSuccessful
、endTransaction
のサポートが終了しました。
バグの修正
- 使用されたトークナイザーが SIMPLE の場合にトークナイザーの引数が削除されていたバグを修正しました。b/125427014
- タイプが内部クラスであるパラメータを指定した suspend 関数を Room が正しく識別できないバグを修正しました。b/123767877
INSERT
、UPDATE
、またはDELETE
のステートメントを使用した遅延@Query
DAO メソッドがメインスレッドでクエリの準備を行っていたバグを修正しました。b/123695593- 一部の suspend 関数に対して Room が不正なコードを生成するさまざまなバグを修正しました。b/123466702、b/123457323
- 生成されたコードで、サポートが終了したメソッドの使用が正しく抑制されていなかったバグを修正しました。b/117602586
- androidx.sqlite の Room の依存関係を 1.0.2 に更新しました。これには、破損したデータベースを正しく処理するための修正が含まれています。b/124476912
既知の問題
- Room 2.1.0-alpha05 は、Maven Central で現在利用できない
kotlinx-metadata-jvm
アーティファクトに依存しています(KT-27991)。 この依存関係は、maven { url "https://kotlin.bintray.com/kotlinx/" }
をプロジェクトのリポジトリに追加することで解決できます。
バージョン 2.1.0-alpha04
2019 年 1 月 25 日
新機能
INSERT
、UPDATE
、またはDELETE
ステートメントを含む@Query
アノテーションが付けられた DAO メソッドが、非同期の型Single
、Mayble
、Completable
、ListenableFuture
を返せるようになりました。さらに、suspend 関数にもできるようになりました。b/120227284
API / 動作の変更
@Transaction
アノテーションが付けられた非抽象 DAO メソッドが非同期の型(Single
、Mayble
、Completable
、LiveData
、ListenableFuture
など)を返す場合、Room がエラーをスローするようになりました。トランザクションはスレッドに限定されるため、Room は現在のところ、異なるスレッドでクエリを実行する可能性のある関数に関するトランザクションの開始と終了ができません。b/120109336OnConflictStrategy.FAIL
とOnConflictStrategy.ROLLBACK
は、Android の現在の SQLite バインディングでは意図したとおりに動作しないため、@Deprecated
になっています。b/117266738
バグの修正
- DAO メソッドが suspend 関数である場合、Room が戻り値の型の TypeConverter を正しく使用しないバグを修正しました。b/122988159
- 継承された suspend 関数を Room が誤って非 suspend と識別するバグを修正しました。b/122902595
@Embedded
フィールドが親クラスにあり、複数の子クラスで使用される場合に、Room が誤ったコードを生成するバグを修正しました。b/121099048beginTransaction()
とendTransaction()
の間で DAO の suspend 関数を呼び出すと、データベースがデッドロックする問題を修正しました。b/120854786
バージョン 2.1.0-alpha03
2018 年 12 月 4 日
API の変更
@Fts3
または@Fts4
の FTStokenizer
が列挙値ではなく文字列を受け取るようになりました。これにより、カスタムの tokenizer を Room で使用できるようになりました。組み込みの tokenizer は依然として、FtsOptions
で文字列定数として定義されています。b/119234881
新機能
- コルーチン: DAO メソッドを suspend 関数として使用できるようになりました。Room の suspend 関数をサポートするために、新しいアーティファクト(
room-coroutines
)がリリースされました。b/69474692 - DAO メソッドのアノテーションに
@Insert
、@Delete
、@Update
のいずれかを使用することで、戻り値の型としてListenableFuture
を使用できるようになりました。b/119418331
バグの修正
- Room が
@Entity
のignoredColumns
プロパティの列を使用して、誤ってコンストラクタを見つけようとするバグを修正しました。b/119830714 - 生成された実装において、Room が DAO メソッドのパラメータを final としてマークしないバグを修正しました。b/118015483
- Room のプロセッサが特殊記号を含むクエリのエラーを報告する際にクラッシュするバグを修正しました。b/119520136
- Room が
IN
式の引数として他のCollection
の各種実装を拒否するバグを修正しました。b/119884035 - Room から返される LiveData が常に監視される場合、ガベージ コレクションが行われ、新しいデータが生成されなくなるバグを修正しました。b/74477406
- ロックの競合を緩和するよう
RoomDatabase
のクローズロックが更新されました。b/117900450
バージョン 2.1.0-alpha02
2018 年 10 月 30 日
新機能
@Relation
の@DatabaseView
を参照できるようになりました。b/117680932
バグの修正
- Rx の戻り値の型を使用して登録や破棄を行う場合に、Room がディスク I/O をメインスレッドで実行するバグを修正しました。b/117201279
- Kotlin エンティティ クラスのフィールドに適した型コンバータを Room が見つけられないバグを修正しました。b/111404868
- 引数のない Kotlin デフォルト メソッドを含む
DAO
インターフェースの実装に適さないコードが Room によって生成されるバグを修正しました。b/117527454 - Room の SQLite 文法パーサーを更新し、ビルド時間が長引く原因となるパフォーマンスの問題を修正しました。b/117401230
バージョン 2.1.0-alpha01
2018 年 10 月 8 日
新機能
- FTS: FTS3 または FTS4 マッピング テーブルを含むエンティティが Room でサポートされるようになりました。
@Entity
アノテーションが付与されたクラスでは、@Fts3
または@Fts4
のアノテーションを追加で使用することにより、全文検索のマッピング テーブルを含むクラスを宣言できるようになりました。アノテーションのメソッドを介して FTS オプションを使用することで、さらにカスタマイズできるようになります。b/62356416 - ビュー: Room で @DatabaseView アノテーションを使用することにより、クラスをストアドクエリ(ビューとも呼ばれます)として宣言できるようになりました。b/67033276
- AutoValue: Room で、AutoValue アノテーションが付与されたクラスをエンティティや POJO として宣言できるようになりました。AutoValue アノテーションが付与されたクラスの抽象メソッドで、Room のアノテーションである
@PrimaryKey
、@ColumnInfo
、@Embedded
、@Relation
を宣言できるようになりました。これらのアノテーションは@CopyAnnotations
とともに使用して、Room が正しく認識できるようにする必要もあります。b/62408420 - Rx の戻り値の型の追加サポート: DAO メソッドのアノテーションに
@Insert
、@Delete
、@Update
のいずれかを使用することで、Rx の戻り値の型としてCompletable
、Single<T>
、Maybe<T>
を使用できるようになりました。b/63317956 @Relation
が付与された不変の型: Room では従来、@Relation
アノテーションが付与されたフィールドは設定できるものである必要がありましたが、それらのフィールドをコンストラクタのパラメータとして指定できるようになりました。enableMultiInstanceInvalidation
:RoomDatabase.Builder
の新しい API です。この API では、1 つのデータベース ファイルで RoomDatabase の複数のインスタンスを無効にできます。この複数インスタンスの無効化メカニズムは、プロセスが複数にわたる場合でも機能します。b/62334005fallbackToDestructiveMigrationOnDowngrade
:RoomDatabase.Builder
の新しい API です。この API は、ダウングレードが発生した場合にデータベースを自動的に再作成します。b/110416954ignoredColumns
:@Entity
アノテーションの新しい API です。この API を使用すると、無視するフィールドをフィールド名のリストで指定できます。エンティティで継承されたフィールドを無視する場合に便利です。b/63522075
API / 動作の変更
RoomDatabase
のmCallback
とmDatabase
が@Deprecated
になりました。これらは Room の次のメジャー バージョンで削除される予定です。b/76109329
バグの修正
- 初期化中にデータベースが破損した場合または不正な移行が行われた場合に、Room を正常に復元できない問題を修正しました。b/111504749、b/111519144
- データクラスに含まれる Kotlin の基本コンストラクタが Room で適切に使用されるようになり、フィールドを
vars
として宣言する必要がなくなりました。b/105769985
バージョン 2.0.0
バージョン 2.0.0
2018 年 10 月 1 日
androidx.room 2.0.0
がリリースされました。2.0.0-rc01 からの変更はありません。
バージョン 2.0.0-rc01
2018 年 9 月 20 日
androidx.room 2.0.0-rc01
がリリースされました。2.0.0-beta01 からの変更はありません。
バージョン 2.0.0-beta01
2018 年 7 月 2 日
API / 動作の変更
RoomDatabase.Builder.setQueryExecutor()
が追加され、クエリの実行場所のカスタマイズが可能になりました。- RxJava2
Observable
のサポートが追加されました。 - 生成された DAO とデータベースの実装は今回が最終版となります。
バグの修正
- 「cannot find getter for field」エラーにクラス / フィールド名が指定されるようになりました。b/73334503
- 旧バージョンの Room との RoomOpenHelper の下位互換性を修正しました。b/110197391
AndroidX 以前の依存関係
AndroidX 以前のバージョンの Room では、次の依存関係を含めます。
dependencies {
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
バージョン 1.1.1
バージョン 1.1.1
2018 年 6 月 19 日
Room 1.1.1
は Room 1.1.1-rc1
とまったく同じです。
バージョン 1.1.1-rc1
2018 年 5 月 16 日: 移行を使用している場合、Room 1.1.0
ではなく 1.1.1-rc1
を使用することを強くおすすめします。
Room で移行後の初期化が適切に処理されないバグを修正しました。b/79362399
バージョン 1.1.0
バージョン 1.1.0-beta3
2018 年 4 月 19 日
バグの修正
- Kotlin POJO が Java で定義された関係エンティティを参照する際に発生するコンパイル エラーを修正しました。b/78199923
バージョン 1.1.0-beta2
2018 年 4 月 5 日
バグの修正
Room の Rx の
Single
とMaybe
の実装における重大なバグを修正しました。このバグは、クエリのリサイクルを早すぎるタイミングで実行し、返されたSingle
インスタンスまたはMaybe
インスタンスに複数のオブザーバーを追加した場合に問題を引き起こしていました。 b/76031240[RoomDatabase.clearAllTables][ref-clearAllTables] がトランザクション内で呼び出された場合、データベースに
VACUUM
を実行しなくなりました。 b/77235565
バージョン 1.1.0-beta1
2018 年 3 月 21 日
API の変更
- API レビューのフィードバックに基づき、
@RawQuery
ではString
をクエリ パラメータとして渡すことができなくなりました。[SupportSQLiteQuery][ref-SupportSQLiteQuery] を使用する必要があります(引数をサポートする [SupportSQLiteQuery][ref-SupportSQLiteQuery] のインスタンスを簡単に作成するには、[SimpleSQLiteQuery][ref-SimpleSQLiteQuery] についてご確認ください)。 - RoomDatabase.Builder の [fallbackToDestructiveMigrationFrom][ref-fallbackToDestructiveMigrationFrom] メソッドで、
vararg Integer
の代わりにvararg int
を使用できるようになりました。
バグの修正
- WAL チェックポイントを設定し、データベースの
VACUUM
を実行することで、[RoomDatabase.clearAllTables][ref-clearAllTables] がオペレーティング システムにスペースを返すようになりました。 - [
@RawQuery
][ref-RawQuery] は、Pojo がEmbedded
フィールドまたはRelation
を介してエンティティを参照する限り、observedEntities
プロパティの Pojo をすべて受け入れるようになりました。 b/74041772 - Paging: Room の DataSource の実装で、マルチテーブルの依存関係(関係、結合など)を適切に処理できるようになりました。以前はこの依存関係により、新しい結果をトリガーできず、コンパイルを実行できないこともありました。 b/74128314
バージョン 1.1.0-alpha1
2018 年 1 月 22 日
新機能
RawQuery
: この新しい API を使用すると、@Dao
メソッドで SQL をクエリ パラメータとして受け取ることができます。 b/62103290、b/71458963fallBackToDestructiveMigrationsFrom
:RoomDatabase.Builder
のこの新しい API を使用すると、よりきめ細かな制御が可能になり、スキーマ バージョンの破壊的な移行を開始できるようになります(fallbackToDestructiveMigration との比較)。 b/64989640- Room で新しい Paging API(alpha-4 以上)のみをサポートするようになりました。非推奨の
LivePagedListProvider
のサポートは終了しました。新しい Room アルファ版を使用するには、Pagingalpha-4
以上を使用し、LivePagedListProvider
からLivePagedListBuilder
に切り替える必要があります(まだ切り替えていない場合)。
バグの修正
- Kotlin Kapt の型に対するサポートが改善されました。b/69164099
- フィールドの順序によってスキーマが無効化されることがなくなりました。b/64290754