产品资讯

Room 3.0 - 使 Room 现代化

阅读用时:4 分钟
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-first 范式,还简化了代码库和开发流程,从而实现更快的迭代速度。
  • 专注于 KSP:我们还将放弃对 Java 注解处理 (AP) 和 KAPT 的支持。Room 3.0 仅是一个 KSP (Kotlin Symbol Processing) 处理器,可更好地处理 Kotlin 代码库,而不受 Java 语言的限制。
  • 协程优先: Room 3.0 采用 Kotlin 协程,使其 API 优先使用协程。协程是与 KMP 兼容的异步框架,而使 Room 本质上成为异步框架是支持 Web 平台的关键要求。

新软件包

为防止与现有的 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 的形式存在,以便在支持关键的 SupportSQLite 用法的同时,实现向 Room 3.0 的迁移。

例如,roomDatabase.openHelper.writableDatabase 的调用可以替换为 roomDatabase.getSupportWrapper(),即使在 Room 的构建器上调用 setDriver(),也会提供封装容器。

如需了解详情,请参阅 room-sqlite-wrapper 文档

Room 和 SQLite Web 支持

支持 Kotlin Multiplatform 目标平台 JS 和 WasmJS,并带来了一些最重要的 API 更改。具体而言,Room 3.0 中的许多 API 都是挂起函数,因为对 Web 存储的适当支持是异步的。SQLiteDriver API 也已更新,以支持 Web,并且 androidx.sqlite:sqlite-web 中提供了一个新的 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 定义中。

例如,分页转换器将位于 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 等),其中包含 bug 修复和依赖项更新。在 Room 3 稳定之前,团队将一直致力于此工作。

最后总结

我们对 Room 3.0 的潜力感到无比兴奋,并期待它为 Kotlin 生态系统带来更多机遇。敬请关注后续动态,我们将继续这段旅程!

继续阅读