Room 3.0:这次不是升级,是重来

用了 Room 这么多年,大家都习惯了那套熟悉的注解和生成代码。但 Google 这次直接玩大的:新包名、只生成 Kotlin 代码、彻底抛弃 KAPT,还把同步的 DAO 方法一刀切了。所有数据库操作必须走协程或者响应式类型。

这不是 Google 闲着没事干,而是为了彻底拥抱 Kotlin Multiplatform(KMP)。Room 从出生就死死绑定 Android 的 SupportSQLite,现在想跨平台(Android、iOS、JVM、甚至 Web),只能大破大立,甩掉历史包袱。

四个最扎心的变化

  1. 全新包名和依赖 以前是 androidx.room:room-runtime,现在变成了 androidx.room3:room3-runtime。 类也从 androidx.room.* 挪到了 android.room3.*。 好处是 2.x 和 3.0 可以并存,方便慢慢迁;坏处是所有 import 都要改一遍。

  2. 彻底告别 Java 代码生成 Room 3.0 只生成 Kotlin 代码。如果你项目里还有纯 Java 的 Entity 或 DAO,该动手迁移了。Google 说维护两套生成逻辑太累,直接砍掉。

  3. 只支持 KSP KAPT 和老的 Java 注解处理器直接下线。还好从 Room 2.4 开始就支持 KSP,大部分项目应该已经转过去了。

  4. DAO 方法必须异步 这是影响面最广的一个。同步阻塞的方法彻底不让写了。

    kotlin 复制代码
    // ❌ Room 3.0 不允许
    @Query("SELECT * FROM users WHERE id = :id")
    fun getUserById(id: Int): User
    
    // ✅ 必须这样
    @Query("SELECT * FROM users WHERE id = :id")
    suspend fun getUserById(id: Int): User
    
    // 或者返回 Flow
    @Query("SELECT * FROM users")
    fun getAllUsers(): Flow<List<User>>

    想同步查数据?自己包一层 runBlocking 或者在协程作用域里调用。Google 的态度很清楚:现代 Android(和 KMP)开发,协程已经是标配了。

怎么平滑迁移?

别慌,Google 其实留了路:

  • 先换 SQLite 驱动:从 Room 2.7 开始就能用新的 androidx.sqlite 驱动 API,建议现在就开始,别再写 SupportSQLite 的代码了。
  • 用兼容层过渡:Room 2.8 提供了 room-sqlite-wrapper,能把新 RoomDatabase 转成老的 SupportSQLiteDatabase,方便逐步替换。
  • 再切到 Room 3.0:等稳定版出来,换依赖和包名。因为可以共存,你甚至可以按模块一个一个迁。
  • 自定义返回类型(RxJava、LiveData 等)需要用新的 @DaoReturnTypeConverter 注解显式注册。

核心思路:先在 2.x 版本里把底层驱动和调用方式准备好,再跳到 3.0。

最大的亮点:真正跨平台了

Room 3.0 不再是"Android 专属"。通过 KMP,它现在原生支持 JavaScript 和 WebAssembly(WasmJs)。Web 端用 androidx.sqlite:sqlite-web 驱动,基于 Web Worker + Origin Private File System(OPFS)实现持久化。

这意味着同一套 Entity、DAO、Database 定义,可以在 Android、iOS(通过 KMP)、桌面、甚至浏览器里复用。数据层逻辑终于不用每个平台重写一遍了,对做跨平台项目的团队来说,价值很大。

Room 2.x 还能继续用吗?

能,但已经进入维护模式。只会出 bug 修复和安全补丁,不会加新功能了。

如果你现在的项目跑得很稳,不急着动也可以。但如果是新项目,或者准备做 KMP,强烈建议直接上 3.0,哪怕它现在还是 alpha。因为拖得越晚,迁移成本只会越高。

写在最后

Room 3.0 是 Jetpack 向 KMP 全面转型的一个重要信号。Google 这次选择不兼容旧世界,直接拥抱 Kotlin-first、协程优先、更干净的架构。短期内肯定有痛点,但长远看,一个能真正跨平台的 Room,对整个生态都是利好。

你项目里还在用 KAPT 吗?打算什么时候开始准备 Room 3.0 迁移?或者你对强制协程这点有什么看法?欢迎评论区一起讨论。

相关推荐
AiMan17 分钟前
腾讯ima还是不可以导出左侧所有对话,只能单条导出,方法不对吗
前端
去伪存真20 分钟前
并发量一高就装死?Agent 全链路“防猝死”手册
前端·agent
Moment22 分钟前
AI 编程时代,聊聊我的 Mac mini 双屏桌面
前端·后端
AiMan33 分钟前
先确认能不能一次把Microsofat Copilot所有内容打包一个文件导出
前端
总要学点什么37 分钟前
第97篇:三维数据加载-城市建筑白模自定义着色器——让一条光带沿高度扫上去,快慢却由帧率说了算
前端·gis·webgl·cesium·着色器·空间分析·白模
木头左44 分钟前
【架构设计】教育类 App 服务端化改造:AI 上移、题库分层与个人题库归属
android·架构设计·系统设计·后端开发·数据库设计
上海懒图科技1 小时前
工厂厂区电子地图定位导航:厂区人车精准定位,安全合规双保障
前端·arcgis·vue
墨狂之逸才1 小时前
USB 的 HOST 和 DEVICE 到底有什么区别?ADB 调试应该选哪个?
android
西安小哥1 小时前
端侧跑大模型,真正的门槛不在参数量:一次 596 秒到 10 秒的压缩路径复盘
前端·人工智能
陈随易2 小时前
Cloudflare 出钱,Vite 团队挑人,44 个维护者分 30 万美元
前端·后端·程序员