サービスに関する最新情報

Room 3.0 - Room のモダナイズ

所要時間: 4 分
Daniel Santiago Rivera のプロフィールを表示
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-runtime は androidx.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 ではコルーチンも必要です。具体的には、DAO 関数は、Flow などのリアクティブ型を返さない限り、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 という新しいアーティファクトが導入されました。このアーティファクトは、SQLiteDriver がインストールされているためにデータベースの SupportSQLite API が無効になっている場合でも、RoomDatabase を SupportSQLiteDatabase に変換できる互換性 API を提供します。これにより、コードベースを完全に移行するのに時間が必要なデベロッパーに、一時的なブリッジが提供されます。このアーティファクトは、Room 3.0 への移行を可能にしつつ、重要な SupportSQLite の使用をサポートするために、androidx.room3:room3-sqlite-wrapper として Room 3.0 に引き続き存在します。

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

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

Room と SQLite のウェブサポート

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

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

カスタム DAO 戻り値の型

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

たとえば、Paging コンバータは 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 が安定するまでこの作業に取り組むことを約束しています。

最後に

Google は、Room 3.0 の可能性と、それが Kotlin エコシステムにもたらす機会に大きな期待を寄せています。今後も最新情報をお届けしていきますので、どうぞご期待ください。

作成者:
続きを読む