Room 3.0是Android持久化库的一次重大更新,在多个关键领域引入了破坏性的变更。新版本聚焦于围绕 Kotlin Multiplatform 现代化 Android 持久化层,并将平台支持扩展到 JavaScript 和 WebAssembly。
Room 3.0 最大的变化是将不再生成 Java 代码,而只生成 Kotlin 代码。开发团队表示,这简化了代码库和开发流程,使迭代速度更快。
随着 Java 代码生成功能被移除,Room 3.0 也不再支持 Java 注解处理(AP,Java Annotation Processing)和 KAPT:
Room 3.0 仅作为 KSP(Kotlin Symbol Processing)处理器运行,从而可以更好地处理 Kotlin 代码库,不再受 Java 语言的限制。
因此,Room 3.0 要求使用 KSP 和 Kotlin 编译器,即便是纯 Java 代码库也不例外。官方建议在这种情况下把 Room 使用隔离在一个独立模块中,这样“就可以应用 Kotlin Gradle Plugin 和 KSP,而不影响其余代码库”。
从架构角度看,还有两项值得注意的破坏性变更:移除 Android 原生 SQLite 数据库 API(SupportSQLite),以及采用协程优先的模型。Room 3.0 不再依赖仅限于 Android 的 API,而是使用兼容 KMP 的androidx.sqlite驱动API,从而无需维护两套 SQL 后端,简化了开发。
采用Kotlin coroutines后,Room 3.0 可实现完全异步的操作。因此,库生成的所有DAO函数(如插入、删除、查询)都定义为suspend。或者,它们也可以返回基于Kotlin Flow的反应式类型,按照顺序发布多个值。
为帮助开发者更容易迁移到 Room 3.0 并摆脱 Android 原生 SQL API,Room 2.8.0 引入了androidx.room:room-sqlite-wrapper。该 artifact 提供了兼容层,可把RoomDatabase转换为SupportSQLiteDatabase:
这为需要更多时间才能完成代码库迁移的开发者提供了临时桥接。该 artifact 在 Room 3.0 中会继续以 androidx.room3:room3-sqlite-wrapper 的形式存在,以支持迁移到 Room 3.0 的同时继续兼容关键的 SupportSQLite 用法。
如前所述,Room 3.0 还把平台支持扩展到了 JavaScript 和 WasmJS。这也带来了一些破坏性的变更,为了正确支持天然异步的 Web 存储,许多 Room 3.0 函数现在都变成了 suspend 函数。
SQLiteDriver API 已更新以支持 Web,并在 androidx.sqlite:sqlite-web 中提供了新的 Web 异步驱动。它是一个基于Web Worker的驱动,可将数据库持久化到源私有文件系统(OPFS,Origin private file system)。
随着 Room 3.0 发布,Room 2 进入了维护模式。在 Room 3.0 稳定之前,Room 2 仅会基于 2.8.0 接收补丁版本,范围限于缺陷修复和依赖更新。
原文链接:
Google Introduces Room 3.0: A Kotlin-First, Async, Multiplatform Persistence Library





