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 变更:
- 停止支持 SQLite 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 生态系统带来的机遇感到非常兴奋。敬请关注后续动态,与我们一起继续探索!
-
产品资讯在智能时代,用户不再只是在应用中点按,而是表达高级目标,并期望 Gemini 等 AI 智能体完成多步骤工作流,有时甚至会跨设备上的多个应用。
Jingyu Shi • 阅读用时:4 分钟 -
产品资讯今天,在 Android 开发者峰会上,我们宣布广泛推出许多工具和 API,旨在消除日常开发中的阻碍,让您能够更灵活地构建出色的 Android 应用。
Matthew McCullough • 阅读用时:4 分钟 -
产品资讯Android Studio Rabbit 2 现已发布稳定版,您可以放心在生产环境中使用。此版本包含多项旨在提升开发体验的关键功能,例如配置您的专属智能体 (BYOA)、XR 模拟器新功能、LeakCanary 更新、全新的智能体 skill 管理器工具、AI 代码审核等。
Matthew Warner • 阅读用时:3 分钟
每周通过电子邮件接收最新的 Android 开发洞见。