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 符号处理)处理器,可以更好地处理 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.8.0(Room 2.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 基于驱动程序,可将数据库持久保留在 Origin 专用文件系统 (OPFS) 中。
如需详细了解如何为 Web 设置 Room,请查看 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 等),其中包含 bug 修复和依赖项更新。在 Room 3 稳定之前,团队将致力于此项工作。
最后总结
我们对 Room 3.0 的潜力及其为 Kotlin 生态系统带来的机遇感到非常兴奋。请继续关注我们的更多更新!
继续阅读
-
产品资讯
每位开发者的 AI 工作流程和需求都是独一无二的,因此能够选择 AI 如何帮助您进行开发非常重要。1 月,我们推出了选择任何本地或远程 AI 模型来为 Android Studio 中的 AI 功能提供支持的功能
Matthew Warner • 阅读用时:2 分钟
-
产品资讯
Android Studio Panda 3 现在已是稳定版,可在生产环境中使用。此版本让您可以更好地控制和自定义 AI 支持的工作流程,从而比以往更轻松地构建高质量的 Android 应用。
Matt Dyor • 阅读用时:3 分钟
-
产品资讯
在 Google,我们致力于将最强大的 AI 模型直接引入您口袋中的 Android 设备。今天,我们非常高兴地宣布推出最新的先进开放模型:Gemma 4。
Caren Chang, David Chou • 阅读用时:3 分钟
随时了解最新动态
每周通过电子邮件接收最新的 Android 开发洞见 每周。