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 和協同程式優先
Room 3.0 不再產生 Java 程式碼,因此即使與 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.8.0 (Room 2.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(),即使 setDriver() 是在 Room 的建構工具上呼叫,系統也會提供包裝函式。
詳情請參閱 room-sqlite-wrapper 說明文件。
Room 和 SQLite 網頁支援
支援 Kotlin Multiplatform 目標 JS 和 WasmJS,並帶來一些最重要的 API 變更。具體來說,Room 3.0 中的許多 API 都是暫停函式,因為對網路儲存空間的適當支援是非同步的。SQLiteDriver API 也已更新,支援網頁,且 androidx.sqlite:sqlite-web 提供新的網頁非同步驅動程式。這是以 Web Worker 為基礎的驅動程式,可將資料庫保留在 Origin 私人檔案系統 (OPFS) 中。
如要進一步瞭解如何設定網頁版 Room,請參閱 Room 3.0 版本資訊。
自訂 DAO 傳回型別
Room 3.0 推出新功能,可將自訂整合項目新增至 Room,類似於 RxJava 和 Paging。透過名為 @DaoReturnTypeConverter 的新註解 API,您可以建立自己的整合,讓 Room 產生的程式碼在執行階段可供存取,這樣一來,@Dao 函式就能擁有自訂回傳型別,不必等待 Room 團隊新增支援。現有整合服務會遷移至使用這項功能,因此現在需要依賴這項功能的開發人員,將轉換器新增至 @Database 或 @Dao 定義。
舉例來說,分頁轉換器會位於 androidx.room3:room3-paging 構件中,並命名為 PagingSourceDaoReturnTypeConverter。同時,轉換器會處於 LiveData 狀態,並稱為 LiveDataDaoReturnTypeConverter。androidx.room3:room3-livedata
詳情請參閱 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 生態系統帶來的機會。敬請持續關注最新消息,瞭解我們的最新進展!
繼續閱讀
-
產品新訊
盡可能確保 Google Play 提供最安全可靠的服務體驗。今天,我們宣布推出一系列新政策和帳戶轉移功能,進一步保障使用者隱私,並防範詐欺行為。
Bennet Manuel • 3 分鐘可讀完
-
產品新訊
現在使用 Android Emulator,就能輕鬆測試支援多種裝置的互動。
Steven Jenkins • 閱讀時間:2 分鐘
-
產品新訊
每位開發人員的 AI 工作流程和需求都不盡相同,因此選擇 AI 輔助開發的方式非常重要。我們在 1 月推出這項功能,讓您選擇任何本機或遠端 AI 模型,為 Android Studio 中的 AI 功能提供支援
Matthew Warner • 閱讀時間:2 分鐘
隨時掌握最新消息
每週透過電子郵件接收最新的 Android 開發洞察資料。