Room 3:通过 wasmJs 和协程支持迁移至新主版本
Room 3 引入了 androidx.room3 包,完全消除了对 Android 特定 SQLite Driver API 的依赖。公共 API 现在使用文档化的替代方案来处理连接。
从旧风格过渡到新风格的示例:
// 之前
roomDatabase.query("select * from users").use { cursor -> ... }
// 之后
roomDatabase.useReaderConnection { connection ->
connection.usePrepared("select * from users") { stmt -> ... }
}
代码生成已从 KAPT 迁移到 KSP。所有内部 DAO 逻辑已重写以使用协程,简化了 Kotlin 多平台中的异步工作。
关键升级是 wasmJs 支持。Room 的 KMP 版本现在与 WebAssembly 兼容,为移动 Web 开发开辟了可能性。
已弃用的功能已被移除,清理了遗留代码库。
迁移到 Room 3 的步骤
迁移过程无需进行根本性的架构更改。主要步骤如下:
- 在 build.gradle.kts 中更新插件和依赖项:
// 根 build.gradle.kts
plugins {
id("androidx.room3") version "3.0.0-alpha02" apply false
}
// 库 build.gradle.kts
plugins {
id("androidx.room3")
}
kotlin {
sourceSets {
commonMain {
val room_version = "3.0.0-alpha02"
implementation("androidx.room3:room3-runtime:$room_version")
ksp("androidx.room3:room3-compiler:$room_version")
}
}
}
room3 {
schemaDirectory("$projectDir/schemas")
}
- 替换导入:RoomDatabase、@Entity 和其他类现在位于 room3 包中。
- 构建项目并修复任何错误。已向 DAO 添加挂起函数,方法命名也已更改。
- 检查 schemas 目录中的数据库模式——Room 3 在编译时需要它们。
迁移后,在所有目标上测试:JVM、Android、iOS、wasmJs。
对 KMP 开发的优势
- 核心协程:挂起函数是 DAO 中的默认选项,无需使用 Flow 或 LiveData。
- wasmJs:完整的 WebAssembly 支持允许在浏览器中运行 Room,无需变通方法。
- KSP 替代 KAPT:更快的编译速度,更少的产物。
代码生成的性能比较(基于典型的 KMP 项目):
| 指标 | Room 2 (KAPT) | Room 3 (KSP) |
|----------------------|---------------|---------------|
| 编译时间 | 45 秒 | 22 秒 |
| APK 大小 | 1.2 MB | 0.9 MB |
| 在 wasm 上运行 | 否 | 是 |
数据为近似值,取决于项目大小。
关键要点
- 新的 room3 包具有干净的 API,摆脱了 Android 依赖。
- 为 KMP 提供完整的协程和 KSP 支持。
- wasmJs 集成用于 Web 应用程序。
- 迁移简单直接:更新依赖项 + 修复导入。
- Alpha 版本:等待稳定版发布后再用于生产环境。
实施建议
对于中级/高级开发者:从全新的 KMP 项目开始。对于遗留项目,推迟迁移直到 3.0.0 稳定版。
使用真实场景进行测试:
- 使用挂起函数的事务。
- wasm 中的模式迁移。
- 浏览器中的查询性能。
Room 3 巩固了其作为多平台通用 ORM 的地位,尤其是在 wasm 生态系统不断增长的背景下。
— Editorial Team
暂无评论。