產品最新消息

Room 3.0 - 現代化 Room

4 分鐘小故事
查看 Daniel Santiago Rivera 的個人資料
Daniel Santiago Rivera 軟體工程師

Room 3.0 的第一個 Alpha 版已發布!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 的依附元件,可避免有兩個可能的後端,進而簡化 Android 的 API 介面。
  • 不再產生 Java 程式碼:Room 3.0 只會產生 Kotlin 程式碼。這不僅符合不斷演進的 Kotlin 優先模式,還能簡化程式碼集和開發程序,加快疊代速度。
  • 專注於 KSP:我們也將停止支援 Java 註解處理 (AP) 和 KAPT。Room 3.0 僅為 KSP (Kotlin Symbol Processing) 處理器,可更有效地處理 Kotlin 程式碼集,不受 Java 語言限制。
  • 協同程式優先: 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 互動的程式碼集是以 Java 編寫,Room 3.0 仍需要 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 的新構件。這個構件提供相容性 API,可讓您將 RoomDatabase 轉換為 SupportSQLiteDatabase,即使資料庫中的 SupportSQLite API 因安裝 SQLiteDriver 而停用,也能進行轉換。這項功能可做為暫時的橋梁,讓開發人員有更多時間完整遷移程式碼集。這個構件在 Room 3.0 中仍以 androidx.room3:room3-sqlite-wrapper 的形式存在,以便遷移至 Room 3.0,同時仍支援重要的 SupportSQLite 用途。

舉例來說,roomDatabase.openHelper.writableDatabase 的叫用可以替換為 roomDatabase.getSupportWrapper(),即使在 Room 的建構工具上呼叫 setDriver(),也會提供包裝函式。

詳情請參閱 room-sqlite-wrapper 說明文件。

Room 和 SQLite 網頁支援

支援 Kotlin Multiplatform 目標 JS 和 WasmJS,並帶來一些最重要的 API 異動。具體來說,Room 3.0 中的許多 API 都是暫停函式,因為網頁儲存空間的適當支援是非同步的。SQLiteDriver API 也已更新,可支援網頁,且 androidx.sqlite:sqlite-web 提供新的網頁非同步驅動程式。這款驅動程式以 Web Worker 為基礎,可將資料庫保存在來源私人檔案系統 (OPFS) 中。

如要進一步瞭解如何設定 Room for the Web,請參閱 Room 3.0 版本資訊。

自訂 DAO 傳回類型

Room 3.0 推出新功能,可將自訂整合項目新增至 Room,類似於 RxJava 和 Paging。透過名為 @DaoReturnTypeConverter 的新註解 API,您可以建立自己的整合,以便在執行階段存取 Room 產生的程式碼,這樣一來,@Dao 函式就能擁有自訂傳回類型,不必等待 Room 團隊新增支援。現有的整合功能已遷移至使用這項功能,因此現在需要依賴這項功能的使用者將轉換器新增至 @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 穩定為止。

結論

我們非常期待 Room 3.0 的潛力,以及它為 Kotlin 生態系統帶來的機會。敬請持續關注最新消息,與我們一起前進!

繼續閱讀