プロダクト ニュース

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-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 に移行する必要があります。この移行は、Room 3.0 のメリットを最大限に活用するために不可欠です。たとえば、BundledSQLiteDriver を介してバンドルされた SQLite ライブラリを使用できるようになります。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 エコシステムにもたらされる機会に大きな期待を寄せています。この取り組みの最新情報にご期待ください。

作成者:
続きを読む