プロダクト ニュース

Room 3.0 - Room の最新化

所要時間: 4 分
Daniel Santiago Rivera
ソフトウェア エンジニア

Room 3.0 の最初のアルファ版がリリースされました。Room 3.0 は、Kotlin Multiplatform(KMP)に重点を置いたライブラリのメジャー バージョンであり、既存の Android、iOS、JVM デスクトップのサポートに加えて、JavaScript と WebAssembly(WASM)のサポートを追加しています。

このブログでは、互換性を破る変更、Room 3.0 の背後にある理由、Room 2.0 から移行するためにできるさまざまなことについて説明します。

破壊的変更

Room 3.0 には、API の互換性を破る次の変更が含まれています。

  • SupportSQLite API の削除: Room 3.0 は、androidx.sqlite ドライバ API によって完全にサポートされています。SQLiteDriver API は KMP と互換性があり、Room の Android API への依存関係を削除することで、2 つのバックエンドを回避できるため、Android の API サーフェスが簡素化されます。
  • Java コードの生成を廃止: Room 3.0 では Kotlin コードのみが生成されます。これは、進化する Kotlin ファーストのパラダイムに沿ったものですが、コードベースと開発プロセスを簡素化し、イテレーションを高速化することもできます。
  • KSP に注力: Java アノテーション処理(AP)と KAPT のサポートも終了します。Room 3.0 は KSP(Kotlin Symbol Processing)プロセッサのみで、Java 言語の制約を受けずに Kotlin コードベースをより適切に処理できます。
  • コルーチン優先: Room 3.0 は Kotlin コルーチンを採用し、API をコルーチン優先にしています。コルーチンは KMP 互換の非同期フレームワークであり、Room を本質的に非同期にすることは、ウェブ プラットフォームをサポートするための重要な要件です。

新しいパッケージ

既存の Room 2.x 実装との互換性の問題や、Room への推移的依存関係を持つライブラリ(WorkManager など)との互換性の問題を回避するため、Room 3.0 は新しいパッケージに存在します。つまり、新しい Maven グループとアーティファクト ID もあります。たとえば、androidx.room:room-runtimeandroidx.room3:room3-runtime になり、androidx.room.RoomDatabase などのクラスは androidx.room3.RoomDatabase に配置されるようになります。

Kotlin とコルーチンを優先

Java コードの生成がなくなったため、Room 3.0 では、Room とやり取りするコードベースが Java であっても、KSP と Kotlin コンパイラが必要になります。Room の使用が集中し、Kotlin Gradle プラグインと KSP をコードベースの残りの部分に影響を与えることなく適用できるマルチモジュール プロジェクトを用意することをおすすめします。

また、Room 3.0 では、Flow などのリアクティブ型を返す場合を除き、コルーチンと DAO 関数が suspend である必要があります。Room 3.0 では、DAO 関数のブロックは許可されません。コルーチンをアプリケーションに統合する方法については、Android でのコルーチンのドキュメントをご覧ください。

SQLiteDriver API への移行

SupportSQLite からの移行に伴い、アプリは SQLiteDriver API に移行する必要があります。この移行は、BundledSQLiteDriver を介してバンドルされた SQLite ライブラリの使用を許可するなど、Room 3.0 のメリットを最大限に活用するために不可欠です。Room 2.7.0 以降では、今日からドライバ API への移行を開始できます。SupportSQLite の使用は今後避けることを強くおすすめします。Room 統合を SQLiteDriver API に移行すると、Room 3.0 への移行が容易になります。パッケージの変更は主にシンボル参照(インポート)の更新を伴い、呼び出しサイトの変更は最小限で済む可能性があります。

SQLiteDriver API の概要については、SQLiteDriver API のドキュメントをご覧ください。

Room を移行して SQLiteDriver API を使用する方法について詳しくは、SupportSQLite から移行するための公式ドキュメントをご覧ください。

Room SupportSQLite ラッパー

SupportSQLite の完全な削除は、すべてのプロジェクトで直ちに実現できるとは限りません。この移行を容易にするため、Room 2.0 シリーズの最新バージョンである Room 2.8.0 では、androidx.room:room-sqlite-wrapper という新しいアーティファクトが導入されました。このアーティファクトは、データベース内の SupportSQLite API が SQLiteDriver のインストールにより無効になっている場合でも、RoomDatabaseSupportSQLiteDatabase に変換できる互換性 API を提供します。これにより、コードベースの完全な移行に時間がかかるデベロッパーに一時的なブリッジが提供されます。このアーティファクトは、重要な SupportSQLite の使用をサポートしながら Room 3.0 への移行を可能にするため、androidx.room3:room3-sqlite-wrapper として Room 3.0 にも存在します。

たとえば、roomDatabase.openHelper.writableDatabase の呼び出しは roomDatabase.getSupportWrapper() に置き換えることができ、setDriver() が Room のビルダーで呼び出された場合でもラッパーが提供されます。

詳しくは、room-sqlite-wrapper のドキュメントをご覧ください。

Room と SQLite のウェブ サポート

Kotlin Multiplatform のターゲットとして JS と WasmJS がサポートされ、API にいくつかの大きな変更が加えられます。特に、Room 3.0 の多くの API は、ウェブ ストレージの適切なサポートが非同期であるため、一時停止関数です。SQLiteDriver API も更新され、ウェブをサポートするようになりました。新しいウェブ非同期ドライバは androidx.sqlite:sqlite-web で利用できます。これは、Origin Private File System(OPFS)にデータベースを永続化できる Web Worker ベースのドライバです。

Room for the Web の設定方法について詳しくは、Room 3.0 リリースノートをご覧ください。

カスタム DAO の戻り値の型

Room 3.0 では、RxJava や Paging と同様に、カスタム統合を Room に追加できるようになりました。@DaoReturnTypeConverter という新しいアノテーション API を使用して独自の統合を作成すると、Room の生成コードが実行時にアクセス可能になり、Room チームがサポートを追加するのを待つことなく、@Dao 関数でカスタムの戻り型を使用できるようになります。既存の統合は、この機能を使用するように移行されます。そのため、この機能に依存するユーザーは、@Database または @Dao の定義にコンバータを追加する必要があります。

たとえば、ページング コンバータは androidx.room3:room3-paging アーティファクトにあり、PagingSourceDaoReturnTypeConverter と呼ばれます。一方、LiveData のコンバータは androidx.room3:room3-livedata にあり、LiveDataDaoReturnTypeConverter と呼ばれます。

詳しくは、Room 3.0 リリースノートの DAO 戻り値の型コンバータのセクションをご覧ください。

Room 2.x のメンテナンス モード

Room の開発は Room 3 に集中するため、現在の Room 2.x バージョンはメンテナンス モードに入ります。つまり、主要な機能は開発されませんが、バグの修正や依存関係の更新を含むパッチ リリース(2.8.1、2.8.2 など)は引き続き行われます。チームは Room 3 が安定するまでこの作業に取り組む予定です。

最後に

Room 3.0 の可能性と、Kotlin エコシステムに広がる機会に、私たちは大きな期待を寄せています。この取り組みを継続していく中で、今後も最新情報をお届けしますので、ご期待ください。

作成者:

続きを読む