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 Surface,因为它避免了使用两个可能的后端。
- 不再生成 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 3.0 还需要 KSP 和 Kotlin 编译器,即使与 Room 交互的代码库是用 Java 编写的也是如此。建议采用多模块项目,其中 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,即使数据库中的 SupportSQLite API 因安装了 SQLiteDriver 而被停用,您也可以使用该 API 将 RoomDatabase 转换为 SupportSQLiteDatabase。这为需要更多时间来完全迁移代码库的开发者提供了一个临时过渡方案。此工件在 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 定义中。
例如,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 生态系统带来的机遇感到非常兴奋。敬请关注后续动态,与我们一起继续这段旅程!
-
产品资讯随着智能体开发不断加速,Android 工程领域正迈向一个令人振奋的新境界:从辅助性代码补全,跃升至智能体在您的指挥下执行端到端任务。您可以完全自主、灵活地选择要使用的模型和智能体。
Jason Buchel • 阅读用时:3 分钟 -
产品资讯今天,我们分享了如何将“不只是商店”的愿景推进到下一个阶段。从月活跃用户数超过 2.5 亿的“我”标签页,到连接超过 7 亿玩家资料的统一游戏平台,Google Play 始终致力于满足用户的各种需求。
Paul Feng • 阅读用时:3 分钟 -
产品资讯我们很高兴能通过 Googlebook 帮助用户表达自我,并让他们能够使用这些工具。
Cyrus Stoller • 阅读用时:2 分钟
每周通过电子邮件接收最新的 Android 开发洞见。