プロダクト ニュース

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 への移行を可能にするため、Room 3.0 では androidx.room3:room3-sqlite-wrapper として引き続き存在します。

たとえば、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 が安定するまでこの作業に取り組んでいます。

まとめ

Google は Room 3.0 の可能性と、Kotlin エコシステムにもたらされる機会に大きな期待を寄せています。この取り組みの最新情報にご期待ください。

作成者:

続きを読む