プロダクト ニュース

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 では、コルーチンも必要です。具体的には、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 のインストールにより無効になっている場合でも、RoomDatabase を SupportSQLiteDatabase に変換できる互換性 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 マルチプラットフォームのターゲットとして JS と WasmJS がサポートされ、最も重要な API の変更がいくつか導入されました。具体的には、Room 3.0 の多くの API は、ウェブ ストレージの適切なサポートが非同期であるため、一時停止関数です。SQLiteDriver API も更新され、ウェブをサポートするようになりました。新しいウェブ非同期ドライバは androidx.sqlite:sqlite-web で利用できます。これは、オリジン プライベート ファイル システム(OPFS)にデータベースを永続化できる Web Worker ベースのドライバです。

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 エコシステムにもたらす機会に大きな期待を寄せています。この取り組みの進捗状況については、今後も最新情報をお届けします。

作成者:
続きを読む