プロダクト ニュース

Room 3.0 - Room の最新化

4 分で読了
月 13 日
Daniel Santiago Rivera
ソフトウェア エンジニア

Room 3.0 の最初のアルファ版がリリースされました。Room 3.0 は、ライブラリの破壊的なメジャー バージョンであり、Kotlin マルチプラットフォーム(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 ではコルーチンも必要です。具体的には、DAO 関数は Flow などのリアクティブ型を返さない限り、中断する必要があります。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 という新しいアーティファクトが導入されました。このアーティファクトは、データベースに SQLiteDriver がインストールされているためにデータベース内の SupportSQLite API が無効になっている場合でも、RoomDatabaseSupportSQLiteDatabase に変換できる互換性 API を提供します。これにより、コードベースを完全に移行するまでに時間がかかるデベロッパーに一時的なブリッジが提供されます。このアーティファクトは、重要な SupportSQLite の使用を引き続きサポートしながら Room 3.0 への移行を可能にするため、Room 3.0 でも androidx.room3:room3-sqlite-wrapper として存在します。

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

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

Room と SQLite のウェブ サポート

Kotlin マルチプラットフォーム ターゲット JS と WasmJS のサポートにより、API が大幅に変更されます。具体的には、ウェブ ストレージの適切なサポートは非同期であるため、Room 3.0 の多くの API は中断関数です。SQLiteDriver API もウェブをサポートするように更新され、新しいウェブ非同期ドライバが androidx.sqlite:sqlite-web で利用できるようになりました。これは、Origin Private File System(OPFS)にデータベースを永続化できる ウェブワーカーベースのドライバです。

ウェブ用に Room を設定する方法の詳細については、 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 エコシステムに提供する機会に非常に期待しています。この取り組みの最新情報にご期待ください。

執筆者:

続きを読む