Room
最新更新 | 稳定版 | 发布候选版本 | Beta 版 | Alpha 版 |
---|---|---|---|---|
2025 年 4 月 23 日 | 2.7.1 | - | - | - |
声明依赖项
要添加对 Room 的依赖项,您必须将 Google Maven 仓库添加到您的项目中。有关详细信息,请阅读Google 的 Maven 仓库。
Room 的依赖项包括测试 Room 迁移和Room RxJava
在您的应用或模块的 build.gradle
文件中添加所需工件的依赖项
Kotlin
dependencies { val room_version = "2.7.1" implementation("androidx.room:room-runtime:$room_version") // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See Add the KSP plugin to your project ksp("androidx.room:room-compiler:$room_version") // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor("androidx.room:room-compiler:$room_version") // optional - Kotlin Extensions and Coroutines support for Room implementation("androidx.room:room-ktx:$room_version") // optional - RxJava2 support for Room implementation("androidx.room:room-rxjava2:$room_version") // optional - RxJava3 support for Room implementation("androidx.room:room-rxjava3:$room_version") // optional - Guava support for Room, including Optional and ListenableFuture implementation("androidx.room:room-guava:$room_version") // optional - Test helpers testImplementation("androidx.room:room-testing:$room_version") // optional - Paging 3 Integration implementation("androidx.room:room-paging:$room_version") }
Groovy
dependencies { def room_version = "2.7.1" implementation "androidx.room:room-runtime:$room_version" // If this project uses any Kotlin source, use Kotlin Symbol Processing (KSP) // See KSP Quickstart to add KSP to your build ksp "androidx.room:room-compiler:$room_version" // If this project only uses Java source, use the Java annotationProcessor // No additional plugins are necessary annotationProcessor "androidx.room:room-compiler:$room_version" // optional - RxJava2 support for Room implementation "androidx.room:room-rxjava2:$room_version" // optional - RxJava3 support for Room implementation "androidx.room:room-rxjava3:$room_version" // optional - Guava support for Room, including Optional and ListenableFuture implementation "androidx.room:room-guava:$room_version" // optional - Test helpers testImplementation "androidx.room:room-testing:$room_version" // optional - Paging 3 Integration implementation "androidx.room:room-paging:$room_version" }
有关使用 KAPT 插件的信息,请参阅 KAPT 文档。
有关使用 KSP 插件的信息,请参阅 KSP 快速入门文档。
有关使用 Kotlin 扩展的信息,请参阅 ktx 文档。
有关依赖项的更多信息,请参阅添加构建依赖项。
(可选)对于非 Android 库(即仅限 Java 或 Kotlin 的 Gradle 模块),您可以依赖 androidx.room:room-common
来使用 Room 注解。
配置编译器选项
Room 具有以下注解处理器选项。
room.schemaLocation |
目录
启用将数据库架构导出为指定目录中的 JSON 文件。有关详细信息,请参阅Room 迁移。 |
room.incremental |
布尔值
启用 Gradle 增量注解处理器。默认值为 true 。 |
room.generateKotlin |
布尔值
生成 Kotlin 源文件而不是 Java。需要 KSP。从 2.7.0 版起,默认值为 true 。有关详细信息,请参阅引入时的 2.6.0 版说明。 |
使用 Room Gradle 插件
从 Room 2.6.0 及更高版本开始,您可以使用 Room Gradle 插件配置 Room 编译器的选项。该插件配置项目,使生成的架构(编译任务的输出并用于自动迁移)正确配置,以实现可重现和可缓存的构建。
要添加插件,请在您的顶级 Gradle 构建文件中定义插件及其版本。
Groovy
plugins { id 'androidx.room' version "$room_version" apply false }
Kotlin
plugins { id("androidx.room") version "$room_version" apply false }
在模块级 Gradle 构建文件中,应用插件并使用 room
扩展。
Groovy
plugins { id 'androidx.room' } android { ... room { schemaDirectory "$projectDir/schemas" } }
Kotlin
plugins { id("androidx.room") } android { ... room { schemaDirectory("$projectDir/schemas") } }
使用 Room Gradle 插件时,必须设置 schemaDirectory
。这将配置 Room 编译器以及各种编译任务及其后端(javac、KAPT、KSP)将架构文件输出到带有风味的文件夹中,例如 schemas/flavorOneDebug/com.package.MyDatabase/1.json
。这些文件应检入仓库,以用于验证和自动迁移。
Room Gradle 插件的某些版本无法配置一些选项,即使 Room 编译器支持它们。下表列出了每个选项,并显示了添加了使用 room
扩展配置该选项支持的 Room Gradle 插件版本。如果您的版本较低,或者该选项尚不支持,您可以改用注解处理器选项。
选项 | 自版本 |
---|---|
room.schemaLocation (必需) |
2.6.0 |
room.incremental |
- |
room.generateKotlin |
- |
使用注解处理器选项
如果您不使用 Room Gradle 插件,或者您想要的选项不受您当前插件版本的支持,您可以使用注解处理器选项配置 Room,如添加构建依赖项中所述。指定注解选项的方式取决于您是为 Room 使用 KSP 还是 KAPT。
Groovy
// For KSP ksp { arg("option_name", "option_value") // other otions... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += [ "option_name":"option_value", // other options... ] } } } }
Kotlin
// For KSP ksp { arg("option_name", "option_value") // other options... } // For javac and KAPT android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { arguments += mapOf( "option_name" to "option_value", // other options... ) } } } }
由于 room.schemaLocation
是一个目录而非原始类型,因此在添加此选项时,必须使用 CommandLineArgumentsProvider
,以便 Gradle 在进行最新检查时了解此目录。迁移您的 Room 数据库展示了提供架构位置的 CommandLineArgumentsProvider
的完整实现。
反馈
您的反馈有助于改进 Jetpack。如果您发现新问题或有改进此库的想法,请告诉我们。在创建新问题之前,请查看此库中的现有问题。您可以通过点击星形按钮为现有问题投票。
有关详细信息,请参阅问题跟踪器文档。
2.7 版
2.7.1 版
2025 年 4 月 23 日
androidx.room:room-*:2.7.1
已发布。2.7.1 版包含这些提交。
Bug 修复
- 修复提供的类型转换器验证期间的
IndexOutOfBoundsException
错误。(b/409804755)。 - 当 Room 配置了
SQLiteDriver
时,支持RoomDatabase.runInTransaction()
。(b/408364828)。
2.7.0 版
2025 年 4 月 9 日
androidx.room:room-*:2.7.0
已发布。2.7.0 版包含这些提交。
2.6.0 以来的重要变化
- Kotlin 多平台 (KMP) 支持:在此版本中,Room 已被重构为 Kotlin 多平台 (KMP) 库。当前支持的平台包括 Android、iOS、JVM(桌面)、原生 Mac 和原生 Linux。有关如何开始使用 Room KMP 的更多信息,请参阅官方 Room KMP 文档。作为 KMP 支持的一部分,Room 还可以配置一个
SQLiteDriver
;有关如何将现有应用迁移到驱动程序 API 和 Room KMP 的信息,请参阅迁移文档。 - 如果通过 KSP 进行处理,KSP 上的Kotlin 代码生成已默认开启。对于 KAPT 或纯 Java 项目,Room 仍将生成 Java 源代码。
- Kotlin 2.0 和 KSP2:Room 现在面向 Kotlin 语言 2.0,并将要求项目也使用 Kotlin 2.0 或更高语言版本进行编译。还添加了对 KSP2 的支持,建议在使用 Room 和 Kotlin 2.0 或更高版本时使用 KSP2。
版本 2.7.0-rc03
2025年3月26日
androidx.room:room-*:2.7.0-rc03
已发布。版本 2.7.0-rc03 包含这些提交。
Bug 修复
- 在执行 Room 阻塞 API(包括阻塞 DAO 函数)期间,线程中断时不再抛出
InterruptedException
(b/400584611)。 - 重新实现 Room 的连接池,以尝试缓解
SQLException: Error code: 5, message: Timed out attempting to acquire a reader connection.
和类似问题 (b/380088809)。
版本 2.7.0-rc02
2025年3月12日
androidx.room:room-*:2.7.0-rc02
已发布。版本 2.7.0-rc02 包含这些提交。
Bug 修复
- 修复自动迁移错误处理 FTS 表上的新列的问题。(b/348227770, Ic53f3)
- 修复通过 KSP 处理非 JVM 源代码时,room-compiler 因
NullPointerException
而崩溃的问题。(b/396607230, I693c9) - 修复 Room 在使用写入连接结束时不会使表失效的问题。(b/340606803, I73ef6)
版本 2.7.0-rc01
2025年2月26日
androidx.room:room-*:2.7.0-rc01
已发布。版本 2.7.0-rc01 包含这些提交。
Bug 修复
- 修复 Room 在初始数据库连接中未设置
busy_timeout
导致SQLException: Error code: 5, message: database is locked
问题 (I93208, b/380088809)。 - 修复 Room 编译器中的一个问题,该问题会导致 KSP 处理器在 Kotlin 2.1.x 和 KSP1 上处理原生源代码集(如 iOS)时崩溃 (I883b8, b/396607230)。
版本 2.7.0-beta01
2025年2月12日
androidx.room:room-*:2.7.0-beta01
已发布。版本 2.7.0-beta01 包含这些提交。
Bug 修复
- 修复
RoomDatabase.inTransaction()
在不应打开已关闭的数据库时打开它,并且应在数据库关闭时快速返回 false 的问题 (b/325432967)。 - 修复 Room 编译器在处理带有 Kotlin 内联/值类的 DAO 函数时发生的崩溃(
IllegalArgumentException: not a valid name
)(b/388299754)。 - 在
room-runtime
的 JVM artifact 中包含 Proguard 规则,以防止生成的数据库实现的默认构造函数被移除,因为 Room 的默认初始化会使用反射来调用它 (b/392657750)。
版本 2.7.0-alpha13
2025年1月29日
androidx.room:room-*:2.7.0-alpha13
已发布。版本 2.7.0-alpha13 包含这些提交。
API 变更
- Room 现在面向 Kotlin 语言 2.0,并将要求项目也使用 Kotlin 2.0 或更高语言版本进行编译。(I8efb0, b/315461431, b/384600605)
Bug 修复
- 修复 Room KMP 数据库构建器中的一个问题,即在 Android 中使用简单名称而非路径时,数据库文件解析路径不会位于应用的 데이터 目录中。(I83315, b/377830104)
- 修复 Room Gradle 插件中的一个问题,即配置 schema 输入和输出在 Android 项目中导致问题:
property 'inputDirectory' is final and cannot be changed any further.
(1dbb4c, b/376071291) - 在 Room Gradle 插件中添加对 KSP2 的支持,修复了插件未正确设置 schema 目录的问题。(Iec3c4, b/379159770)
外部贡献
- 修复 Room 分页集成导致 UI 跳转的问题,当刷新初始键太靠近列表末尾时。感谢 Eva!(I2abbe, b/389729367)
版本 2.7.0-alpha12
2024年12月11日
androidx.room:room-*:2.7.0-alpha12
已发布。版本 2.7.0-alpha12 包含这些提交。
API 变更
- 添加实验性 API
RoomDatabase.Builder.setInMemoryTrackingMode()
以配置 Room 是否使用内存表进行失效跟踪。(I2a9b2, b/185414040)
Bug 修复
- 破坏性迁移现在会删除视图以确保它们被重新创建,使
allowDestructiveMigrationForAllTables
开启(KMP 默认)时的行为与关闭时的现有行为保持一致。(0a3e83, b/381518941)
版本 2.7.0-alpha11
2024年10月30日
androidx.room:room-*:2.7.0-alpha11
已发布。版本 2.7.0-alpha11 包含这些提交。
API 变更
- 重新审视新添加的
convertRows()
方法签名,使其成为一个接收RawRoomQuery
用于 room-paging 的 suspend 函数。(Ie57b5, b/369136627)
Bug 修复
- 修复了 room-paging 中使用
@Relation
结合PagingSource
时生成无效代码的问题。
版本 2.7.0-alpha10
2024年10月16日
androidx.room:room-*:2.7.0-alpha10
已发布。版本 2.7.0-alpha10 包含这些提交。
API 变更
- 创建内部
ByteArrayWrapper
类,以支持非 Android 和非 JVM 平台中与ByteBuffer
的关联。(I75543, b/367205685) - 添加
SQLiteStatement.getColumnType()
以及各种SQLITE_DATA_*
结果常量,以启用检索列的数据类型。(I1985c, b/369636251)
版本 2.7.0-alpha09
2024年10月2日
androidx.room:room-*:2.7.0-alpha09
已发布。版本 2.7.0-alpha09 包含这些提交。
Bug 修复
- 修复
room-paging
的 KMP 实现中的一个问题,该问题会导致因在只读连接上启动写入事务而引发Error code: 8, message: attempt to write a readonly database
错误。(b/368380988)
版本 2.7.0-alpha08
2024年9月18日
androidx.room:room-*:2.7.0-alpha08
已发布。版本 2.7.0-alpha08 包含这些提交。
新功能
room-paging
artifacts 已迁移以兼容 KMP。(Ib8756, b/339934824)- API
invalidationTrackerFlow()
已作为InvalidationTracker.createFlow()
的第一方 API 通用化,现在可在 KMP 项目的非 Android 源代码集中使用。(I1fbfa, (I8fb29), b/329291639, b/329315924)
API 变更
- Room 中所有使用
Cursor
一词的警告和错误消息已被移除或替换,因为在 Room 的 KMP 版本中,Cursor
不再是一个准确的通用术语。(Id8cd9, b/334087492)
Bug 修复
- 修复了 Room KMP 尝试为非 JVM 平台发出使用
UUID
的代码的问题。(b/362994709) - 修复了 Room Gradle Plugin 在与 Compose Multiplatform 一起用于 KMP 项目时会导致“Cannot change attributes of configuration … after it has been locked for mutation”等错误的问题。(b/343408758)
版本 2.7.0-alpha07
2024年8月21日
androidx.room:room-*:2.7.0-alpha07
已发布。版本 2.7.0-alpha07 包含这些提交。
新功能
- Room Gradle 插件现在将自动把导出的 schema 添加到 Android Instrumentation Test 资源源代码中,以便
MigrationTestHelper
可以使用它们。
Bug 修复
- 修复了
RoomDatabaseConstructor
生成的“actual”在“initialize”函数中缺少“actual”修饰符的问题,如果该函数也在“expect”声明中被覆盖。(359631627) - 修复了
RoomDatabaseConstructor
生成的“actual”与“expect”声明的可见性不匹配的问题。(358138953)
版本 2.7.0-alpha06
2024年8月7日
androidx.room:room-*:2.7.0-alpha06
已发布。版本 2.7.0-alpha06 包含这些提交。
API 变更
- 更改 KMP 项目中
RoomDatabase
的实例化设置。
由于 Kotlin 2.0 编译模型,引用一个名为 instantiateImpl()
的待生成函数的策略不再可行。引入了两个新 API,@ConstructedBy
和 RoomDatabaseConstructor
来取代 instantiateImpl()
策略。新策略如下:
定义一个实现
RoomDatabaseConstructor
的 expect 对象expect object MyDatabaseCtor : RoomDatabaseConstructor<MyDatabase>
使用
@ConstructedBy
将该对象与@Database
声明关联@Database(...) @ConstructedBy(MyDatabaseCtor::class) // NEW abstract class MyDatabase : RoomDatabase
创建一个新的数据库实例,但不传递工厂参数
fun createNewDatabase(path: String) = Room.databaseBuilder<AppDatabase>(name = path) .setDriver(BundledSQLiteDriver()) .setQueryCoroutineContext(Dispatchers.IO) .build()
修复了b/316978491、b/338446862 和b/342905180 中的问题
- 通过添加一个新 API
RoomRawQuery
来支持 Room KMP 中的@RawQuery
,该 API 在保存原始 SQL 字符串和将参数绑定到语句的功能方面与SupportSQLiteQuery
类似。带有@RawQuery
注解的函数现在可以接受RoomRawQuery
作为其唯一参数。(Iea844, b/330586815) - 添加一个接受
CoroutineContext
的setQueryCallback()
重载。(Id66ff, b/309996304) - 添加了对
linuxArm64
Kotlin 多平台目标的支持 (I139d3, b/338268719)
Bug 修复
- 修复 Room 在非 Android 目标中错误生成对
recursiveFetchArrayMap
的调用问题。(710c36, b/352482325) - 修复 Room 在 KMP 项目中有时会抛出“Timed out attempting a connection”异常的问题。(fa72d0, b/347737870)
- 修复自动迁移中的一个问题,即在其他表更改其 schema 以符合新外键之前,过早地检查外键。(7672c0, b/352085724)
版本 2.7.0-alpha05
2024年7月10日
androidx.room:room-*:2.7.0-alpha05
已发布。版本 2.7.0-alpha05 包含这些提交。
API 变更
- 将
SQLiteKt
重命名为SQLite
,将BundledSQLiteKt
重命名为BundledSQLite
。(I8b501)
Bug 修复
- 修复了一个 bug,即使用
AndroidSQLiteDriver
时,RoomDatabase
会死锁或因连接超时而报错。
版本 2.7.0-alpha04
2024年6月12日
androidx.room:room-*:2.7.0-alpha04
已发布。版本 2.7.0-alpha04 包含这些提交。
Bug 修复
- 修复了 Room 的注解处理器在 DAO 中定义多映射返回类型时会生成不兼容 KMP 代码的问题。(b/340983093)
- 修复了 Room 在
@Database
注解类没有包名时,无法找到生成的数据库实现的问题。(b/342097292) - 修复了启用自动关闭和多实例失效有时会在数据库因空闲而自动关闭时导致
ConcurrentModificationException
的问题。
版本 2.7.0-alpha03
2024年5月29日
androidx.room:room-*:2.7.0-alpha03
已发布。版本 2.7.0-alpha03 包含这些提交。
Bug 修复
- 修复了与 Kotlin 2.0 和 KSP 2.0 相关的各种问题。请注意,对 Kotlin 2.0 和 KSP 2 的支持尚未完成,团队正在开发新编译器中的各种 API 和行为变更。(b/314151707)
版本 2.7.0-alpha02
2024年5月14日
androidx.room:room-*:2.7.0-alpha02
已发布。版本 2.7.0-alpha02 包含这些提交。
Bug 修复
- 修复了各种 KSP 问题。
版本 2.7.0-alpha01
2024年5月1日
androidx.room:room-*:2.7.0-alpha01
已发布。版本 2.7.0-alpha01 包含这些提交。
新功能
- Kotlin 多平台 (KMP) 支持:在此版本中,Room 已被重构为 Kotlin 多平台 (KMP) 库。尽管仍有一些工作要做,但此版本引入了一个新版本的 Room,其中大部分功能已“通用化”(使其成为多平台)。当前支持的平台包括 Android、iOS、JVM(桌面)、原生 Mac 和原生 Linux。新支持平台中缺失的任何功能将在即将发布的 Room 版本中“功能完整”。
有关如何开始使用 Room KMP 的更多信息,请参阅官方 Room KMP 文档。
- 如果通过 KSP 进行处理,KSP 上的Kotlin 代码生成已默认开启。对于 KAPT 或纯 Java 项目,Room 仍将生成 Java 源代码。
API 变更
- 已添加
Room.databaseBuilder()
的一个重载,它接受一个 lambda 参数,该参数旨在与 Room 生成的函数一起使用,以避免在实例化生成的RoomDatabase
实现时使用反射。示例用法是
Room.databaseBuilder<MyDatabase>(
context = appContext,
name = dbFilePath,
factory = { MyDatabase::class.instantiateImpl() }
)
- 在构建器中添加了一个用于使用
CoroutineContext
配置 Room 的 API:RoomDatabase.Builder.setQueryCoroutineContext
。请注意,RoomDatabase
只能使用setQueryExecutor
配置执行器,或使用 Coroutine 上下文,不能两者同时使用。 - 添加了一个用于使用
SQLite
Driver 配置 Room 的 API:RoomDatabase.Builder.setDriver()
。有关SQLite
Driver API 的更多信息,请参阅 SQLite KMP 文档 - 已添加用于从驱动程序 API 访问底层
SQLiteConnection
的 API:RoomDatabase.useReaderConnection
和RoomDatabase.useWriterConnection
。 - 各种 Room 相关回调现在有一个重载版本,接收
SQLiteConnection
而不是SupportSQLiteDatabase
。这些旨在在迁移到 KMP 项目时被覆盖。有关将 Android 应用中的 Room 用法迁移到通用 KMP 模块的更多信息,请参阅迁移指南。回调包括:Migration.migrate(SQLiteConnection)
AutoMigrationSpec.onPostMigrate(SQLiteConnection)
RoomDatabase.Callback.onCreate(SQLiteConnection)
RoomDatabase.Callback.onDestructiveMigration(SQLiteConnection)
RoomDatabase.Callback.onOpen(SQLiteConnection)
- KTX artifact
androidx.room:room-ktx
及其所有 API 已合并到androidx.room:room-runtime
中,该 artifact 现在为空。请将其从您的依赖列表中移除。
版本 2.6
版本 2.6.1
2023年11月29日
androidx.room:room-*:2.6.1
已发布。版本 2.6.1 包含这些提交。
Bug 修复
- 解决了生成代码中的问题,其中
EntityCursorConverter
中 Double 列的默认值被设置为 0 而不是 0.0。还包含了对 Float 类型列类似边缘情况的潜在修复。(Id75f5, b/304584179) - 从
PagingSource
加载抛出的异常现在将作为包含 Throwable 的LoadResult.Error
的LoadStateUpdate
传播。此错误状态可通过PagingDataAdapter.loadStateFlow(Views)
或LazyPagingItems.loadState(Compose)
观察。请注意,这标志着行为上的改变,过去加载错误会作为触发加载的 dao 方法抛出的异常冒泡。(I93887, b/302708983)
版本 2.6.0
2023年10月18日
androidx.room:room-*:2.6.0
已发布。版本 2.6.0 包含这些提交。
2.5.0 以来的重要变化
- 在 Room KSP 中,现在可以使用启用 Kotlin 代码生成(或“Kotlin CodeGen”)的选项。(4297ec0)。要在 Room 中开启 Kotlin CodeGen,请将
room.generateKotlin
选项名称添加到 KSP 的处理器选项中。有关如何为 KSP 传递处理器选项的更多详细信息,请参阅 KSP 文档。
注意:使用 Kotlin CodeGen 时,请务必注意已添加的额外限制。在 Kotlin CodeGen 中,不允许将抽象属性作为 DAO getter 或 DAO 查询,而是应将其重写为函数,以避免属性值不可变且具有固定存储结果的错误概念。另一个已添加的限制是,在 Kotlin CodeGen 中,Room 不再允许可空集合返回类型。
警告:使用 Kotlin CodeGen 时,您可能会发现项目在可空性方面更加严格。在 Kotlin CodeGen 中,类型参数的可空性很重要,而在 Java 中,这通常被忽略。例如,假设您有一个 Flow
Flow
- Room Gradle 插件的新 artifact 已添加到 Room 中,其 ID 为
androidx.room
,这解决了 Room 中通过 Gradle 注解处理器选项处理 schema 输入和输出的各种现有问题。有关更多详细信息,请参阅Room 版本 2.6.0-alpha02 发行说明。 - Room Entity 中的值类现在支持 KSP。(4194095)
- DAO 函数中的嵌套 Map 返回类型现在在 Room 中受支持。(I13f48, 203008711)
版本 2.6.0-rc01
2023年9月20日
androidx.room:room-*:2.6.0-rc01
已发布。版本 2.6.0-rc01 包含这些提交。
版本 2.6.0-beta01
2023年8月23日
androidx.room:room-*:2.6.0-beta01
已发布。版本 2.6.0-beta01 包含这些提交。
Bug 修复
- 处理 upsert 期间遇到的特殊
SQLite
异常,即当 upsert 期间抛出2067 SQLITE_CONSTRAINT_UNIQUE
异常时,upsert 应执行更新操作。(If2849, b/243039555)
版本 2.6.0-alpha03
2023年8月9日
androidx.room:room-*:2.6.0-alpha03
已发布。版本 2.6.0-alpha03 包含这些提交。
新功能
API 变更
- 创建了一个名为
@MapColumn
的新类型注解来替换已废弃的@MapInfo
。对于@MapInfo
注解中提供的每个列名(keyColumnName
、valueColumnName
或两者),您需要声明一个只包含columnName
的@MapColumn
注解,并在 DAO 函数返回类型中引用的特定类型参数(Map 的键或值)上使用该注解。这是因为@MapColumn
注解直接用于 DAO 函数返回类型中的类型参数上,而不是像@MapInfo
那样用于函数本身。有关更多信息,请参阅@MapColumn
文档。(Ib0305, b/203008711) - 更新了 API 文件以注解兼容性抑制 (I8e87a, b/287516207)
- Room Gradle 插件的 API 已更新,不再总是需要按变体配置。这意味着插件可以接受所有变体的全局位置,而无需创建多个目录,从而实现更平滑的迁移,同时又足够灵活,可以手动配置 flavors 或构建类型 schema,同时仍保留插件的优势(可重现和可缓存的构建)。(I09d6f, b/278266663)
Bug 修复
- 修复了
QueryInterceptorStatement
中潜在的内存泄漏漏洞。(I193d1) - 修复了
QueryInterceptorDatabase execSQL()
函数中的不正确行为。(Iefdc8)
版本 2.6.0-alpha02
2023年6月21日
androidx.room:room-*:2.6.0-alpha02
已发布。版本 2.6.0-alpha02 包含这些提交。
Room Gradle 插件
这个新版本包含了 Room Gradle 插件的一个新 artifact,其 ID 为 androidx.room
,它解决了 Room 中通过 Gradle 注解处理器选项处理 schema 输入和输出的各种现有问题。Room Gradle 插件配置项目,使得用于自动迁移并作为编译任务输出的生成 schema 能够正确配置,以实现可重现和可缓存的构建。该插件提供了一个 DSL 来配置基本 schema 位置
room {
schemaDirectory("$projectDir/schemas/")
}
然后,该插件将配置 Room 编译器以及各种编译任务及其后端(javac、KAPT、KSP),将 schema 文件输出到特定 flavor 的文件夹中,例如 schemas/flavorOneDebug/com.package.MyDatabase/1.json
。通常,这些文件会签入到仓库中,用于验证和自动迁移。从使用注解处理器选项迁移到使用插件时,必须将现有 schema 文件复制到插件生成的 flavor 目录中,这是一次性的手动迁移操作。[`developers.android.com`](https://developer.android.com/) 上的 schema 文档将在未来获得反馈并插件达到稳定后更新,因此请尝试使用。
API 变更
RoomDatabase.QueryCallback
已被定义为一个函数式接口,以允许 SAM 转换用法。(Iab8ea, b/281008549)
Bug 修复
- 解决了 Room 源代码从 Java 迁移到 Kotlin 后,在 Robolectric 中实例化数据库时出现的问题。(Ic053c, b/274924903)
版本 2.6.0-alpha01
2023年3月22日
androidx.room:room-*:2.6.0-alpha01
已发布。版本 2.6.0-alpha01 包含这些提交。
新功能
- Room 支持 KSP 中的值类。Room 现在能够在 Entity 中支持值类。(4194095)
- Kotlin 代码生成(或“Kotlin CodeGen”)现在可以在 Room 中启用 (4297ec0)。要在 Room 中开启 Kotlin CodeGen,请将
room.generateKotlin
选项名称添加到 KSP 的处理器选项中。有关如何为 KSP 传递处理器选项的更多详细信息,请参阅 KSP 文档。
注意:使用 Kotlin CodeGen 时,请务必注意已添加的额外限制。在 Kotlin CodeGen 中,不允许将抽象属性作为 DAO getter 或 DAO 查询,而是应将其重写为函数,以避免属性值不可变且具有固定存储结果的错误概念。另一个已添加的限制是,在 Kotlin CodeGen 中,Room 不再允许可空集合返回类型。
警告:使用 Kotlin CodeGen 时,您可能会发现项目在可空性方面更加严格。在 Kotlin CodeGen 中,类型参数的可空性很重要,而在 Java 中,这通常被忽略。例如,假设您有一个 Flow
Flow
API 变更
- 防止在 DAO 方法返回类型中无意义地使用可空集合。(I777dc, b/253271782, b/259426907)
- 添加了一个 API,用于创建发出失效跟踪器更改的 Flow。该 API 对于创建需要响应数据库更改的流很有用。(I8c790, b/252899305)
Bug 修复
- 在 Kotlin codegen 中,不允许将抽象属性作为 DAO getter 或 DAO 查询,而是应将其重写为函数,以避免属性值不可变且具有固定存储结果的错误概念。(If6a13, b/127483380, b/257967987)
版本 2.5.2
版本 2.5.2
2023年6月21日
androidx.room:room-*:2.5.2
已发布。版本 2.5.2 包含这些提交。
Bug 修复
- 修复了与 kotlinx-metadata-jvm 的不兼容问题。(386d5c)
- 修复了 Room 在 Robolectric 测试中使用时会抛出错误的问题。(f79bea, b/274924903)
版本 2.5.1
版本 2.5.1
2023年3月22日
androidx.room:room-*:2.5.1
已发布。版本 2.5.1 包含这些提交。
Bug 修复
- 如果数据库已打开,则避免在
FrameworkSQLiteHelper
中检查数据库父目录。(5de86b8) - 在检查数据库是否已打开时,使用
isOpenInternal
检查。(e91fb35) - Room 的
acquireTransactionThread()
中的可重入情况现在得到了更好的处理。(219f98b)。在挂起事务期间,Room 使用事务执行器中的一个线程,在该线程中启动一个事件循环,并将挂起数据库操作分派给它,以便它们都封装在事务协程中。通常,事务线程与启动事务的线程不同,但在某些情况下它们是相同的。为了处理此类可重入情况,withTransaction()
已重构为不再依赖控制作业,而是将在事务线程中的runBlocking
中执行挂起事务块。
版本 2.5.0
版本 2.5.0
2023年2月22日
androidx.room:room-paging-guava:2.5.0
、androidx.room:room-paging-rxjava2:2.5.0
和 androidx.room:room-paging-rxjava3:2.5.0
已发布。版本 2.5.0 包含这些提交。
版本 2.5.0
2023年1月11日
androidx.room:room-*:2.5.0
已发布。版本 2.5.0 包含这些提交。
2.4.0 以来的重要变化
room-runtime
的所有源代码已从 Java 转换为 Kotlin。请注意,如果您的代码是 Kotlin 语言,由于库转换为 Kotlin,您可能会遇到源代码不兼容问题。例如,一个已知的源代码不兼容更改是,在InvalidationTracker
中,您现在需要在Observer
中声明onInvalidate()
,使其参数类型为Set
而不是MutableSet
。此外,某些 getter 方法已转换为属性,需要在 Kotlin 文件上使用属性访问语法。如果存在任何重大不兼容问题,请提交 bug 报告。- 添加了一个新的快捷注解,
@Upsert
,它在没有唯一性冲突时尝试插入实体,或者在存在冲突时更新实体。(I7aaab, b/241964353) - 新的 room-paging artifacts
room-paging-rxjava2
、room-paging-rxjava3
和room-paging-guava
已添加,用于支持 Room 分页。 - 添加了用于在
@MapInfo
中提供键和值表名称以进行消歧的 API (Icc4b5)
版本 2.5.0-rc01
2022年12月7日
androidx.room:room-*:2.5.0-rc01
已发布。版本 2.5.0-rc01 包含这些提交。
- 此版本与
2.5.0-beta02
相同。
版本 2.5.0-beta02
2022年11月9日
androidx.room:room-*:2.5.0-beta02
已发布。版本 2.5.0-beta02 包含这些提交。
API 变更
- 修复了各种 API,它们将查询参数从不变(
Array<Any?>
)更改为逆变(Array<out Any?>
),以匹配 Java 的数组行为。(b/253531073)
版本 2.5.0-beta01
2022年10月5日
androidx.room:room-*:2.5.0-beta01
已发布。版本 2.5.0-beta01 包含这些提交。
API 变更
- 将支持
@Upsert
的最低版本限制为 API 16。这是因为在旧版 API 中无法识别主键约束冲突。(I5f67f, b/243039555)
Bug 修复
- 修复了影子表错误地导出到 schema
.json
文件并导致其损坏的问题。(I4f83b, b/246751839)
版本 2.5.0-alpha03
2022年8月24日
androidx.room:room-*:2.5.0-alpha03
已发布。版本 2.5.0-alpha03 包含这些提交。
新功能
- 添加了一个新的快捷注解,
@Upsert
,它在没有唯一性冲突时尝试插入实体,或者在存在冲突时更新实体。(I7aaab, b/241964353)
Bug 修复
- 在自动迁移外键约束检查期间,Room 现在将抛出
SQLiteConstraintException
而不是IllegalStateException
。(I328dd) - 修复了 Kotlin 源代码中与
getOpenHelper
、getQueryExecutor
和getTransactionExecutor
的 getter / 属性不兼容的更改。(Iad0ac)
版本 2.5.0-alpha02
2022年6月1日
androidx.room:room-*:2.5.0-alpha02
已发布。版本 2.5.0-alpha02 包含这些提交。
新功能
- 新的
room-paging
artifactsroom-paging-rxjava2
、room-paging-rxjava3
和room-paging-guava
已添加,用于支持 Room 分页。( 41a1d4,b/203666906),( eb6098,b/203666906),( 1b9ae4,b/203666906)
API 变更
room-runtime
的所有内容已从 Java 转换为 Kotlin。(If2069, b/206859668),(Ie4b55, b/206859668), (I697ee, b/206859668), (I96c25, b/206859668)注意:由于库转换为 Kotlin,您可能会遇到源代码不兼容问题。如果您的代码是 Kotlin 语言并调用旧版本的 Room,则新版本需要处理这些情况。例如,一个已知的源代码不兼容更改是,在
InvalidationTracker
中,您现在需要在Observer
中声明onInvalidate()
,使其参数类型为Set
而不是MutableSet
。- 添加了用于在
@MapInfo
中提供键和值表名称以进行消歧的 API (Icc4b5) - 修复了源兼容性问题,以重新允许在属性 getter 中使用
@Ignore
。(Ifc2fb)
Bug 修复
- 重复列解析启发式算法。Room 现在将尝试解析多映射查询中的歧义列。这允许将包含同名表的 JOIN 正确映射到结果数据对象。(I4b444, b/201306012, b/212279118)
版本 2.5.0-alpha01
2022年2月23日
androidx.room:room-*:2.5.0-alpha01
已发布。版本 2.5.0-alpha01 包含这些提交。
API 变更
- 修复了 Room
@IntDef
用法在 Kotlin 源代码中未强制执行的问题。(I75f41, b/217951311) - 修复了源兼容性问题,以重新允许在属性 getter 中使用
@Query
。(I0a09b) - 将 room-common 从 Java 转换为 Kotlin。(I69c48, b/206858235)
注意:由于库转换为 Kotlin,某些属性已移至伴生对象中,您可能会遇到源代码不兼容问题。如果您的代码是 Kotlin 语言并调用旧版本的 Room,则新版本在访问这些属性时需要添加“.Companion”后缀。
- 将 room-migration 从 Java 转换为 Kotlin。(I2724b, b/206858622)
- 将
room-runtime
中与paging
相关的文件从 Java 转换为 Kotlin。(I82fc8, b/206859668) - 添加了用于在 FrameworkSQLite* 级别进行多进程锁定和使用的 API,以保护多进程首次数据库创建和迁移。(Ied267, b/193182592)
Bug 修复
- 添加了对 Kotlin 源代码中内部属性的支持。这是 Room 中行为的轻微更改,它将使用函数的源代码名称将其与属性作为 getter/setter 进行匹配(以前,它使用的是函数的 JVM 名称,这对于内部函数/属性是不同的)。如果您使用自定义
@JvmName
注解将 getter/setter 与私有属性匹配,请在更新后仔细检查生成的代码 (If6531, b/205289020)
版本 2.4.3
版本 2.4.3
2022年7月27日
androidx.room:room-*:2.4.3
已发布。版本 2.4.3 包含这些提交。
Bug 修复
- 修复了 Room 在 Kotlin 1.7 中无法识别 suspend 函数的问题 (b/236612358)
版本 2.4.2
版本 2.4.2
2022年2月23日
androidx.room:room-*:2.4.2
已发布。版本 2.4.2 包含这些提交。
Bug 修复
- 修复了为 Dao
@Transaction
suspend 函数生成代码时,由于使用-Xjvm-default=all
或等效编译而导致其主体生成默认接口方法的问题。(Ia4ce5) - 解决了 Room 为
Array<ByteArray>
返回类型查询方法生成代码的 bug。(If086e, b/213789489)
版本 2.4.1
版本 2.4.1
2022年1月12日
androidx.room:room-*:2.4.1
已发布。版本 2.4.1 包含这些提交。
Bug 修复
- 添加了对 Kotlin 源代码中内部属性的支持。这是 Room 中行为的轻微更改,它将使用函数的源代码名称将其与属性作为 getter/setter 进行匹配(以前,它使用的是函数的 JVM 名称,这对于内部函数/属性是不同的)。如果您使用自定义
@JvmName
注解将 getter/setter 与私有属性匹配,请在更新后仔细检查生成的代码 (If6531, b/205289020)
版本 2.4.0
版本 2.4.0
2021年12月15日
androidx.room:room-*:2.4.0
已发布。版本 2.4.0 包含这些提交。
2.3.0 以来的重要变化
- 自动迁移:Room 现在提供了一个 API,只要导出 schema,就可以自动生成迁移。要让 Room 知道它应该生成自动迁移,可以使用新属性
@Database#autoMigrations
来声明自动迁移的源版本和目标版本。当 Room 需要有关表和列重命名或删除的额外信息时,@AutoMigration
注解可以声明一个包含此类输入的规范类。有关更多详细信息,请参阅@AutoMigration
文档。 - 自动迁移中的依赖注入:
@ProvidedAutoMigrationSpec
是一个新 API,用于声明AutoMigrationSpec
将通过RoomDatabase.Builder#addAutoMigrationSpec()
在运行时提供。这允许依赖注入框架在需要复杂依赖时提供此类规范。 - 迁移测试助手支持自动迁移:Room 的
MigrationTestHelper
已更新,通过提供一个新的构造函数 API 来支持自动迁移,该 API 接收正在测试的数据库类。这允许助手在runMigrationsAndValidate
期间以相同方式自动添加自动迁移。 - Room-Paging 支持:
androidx.room:room-paging
已发布,为返回androidx.paging.PagingSource
的 Room 查询提供原生的 Paging 3.0 支持。 - 关系查询方法:Room 现在支持多映射返回类型
@Dao
方法,这对于 JOIN 语句很有用。支持的多映射类型包括Map
、SparseArray
、LongSparseArray
,以及 Guava 的ImmutableMap
、ImmutableSetMultimap
和ImmutableListMultimap
。
版本 2.4.0-rc01
2021年12月1日
androidx.room:room-*:2.4.0-rc01
已发布。版本 2.4.0-rc01 包含这些提交。
新功能
- 将 Room 对 KSP 的依赖更新为
1.6.0-1.0.1
以支持 Kotlin 1.6
版本 2.4.0-beta02
2021年11月17日
androidx.room:room-*:2.4.0-beta02
已发布。版本 2.4.0-beta02 包含这些提交。
新功能
- 我们在
@MapInfo
中添加了对 SparseArray 和 LongSparseArray 的支持。(Ic91a2b/138910317)
Bug 修复
- 我们添加了一个新的 TypeConverter 分析器,它考虑了类型中的可空性信息。由于此信息仅在 KSP 中可用,因此它默认仅在 KSP 中开启。如果它导致任何问题,您可以通过向注解处理器传递 room.useNullAwareTypeAnalysis=false 来关闭它。如果发生这种情况,请提交 bug 报告,因为此标志将在未来移除。使用这个新的 TypeConverter 分析器,建议只提供非空接收 TypeConverter,因为新分析器能够用 null 检查包装它们。请注意,这对于使用 KAPT 或 Java 的用户没有影响,因为注解处理器(与 KSP 不同)不包含类型中的可空性信息。(Ia88f9, b/193437407)
- 修复了 Room 在 FTS 实体声明使用 ICU tokenizer 时,编译会因 SQL 错误而失败的 bug。(I00db9, b/201753224)
- 解决了自动迁移中关于版本之间嵌入式实体添加新列的问题。(I5fcb1b/193798291)
- 我们解决了 LEFT JOIN 查询中关系查询方法返回类型的问题。通过这些更改,在存在一对多映射的情况下,如果游标中未找到无效值对象,则为键返回的集合将不包含该无效值对象。如果未找到有效值,则键将映射到空集合。(Id5552b/201946438)
- 解决了自动迁移中 SQLite 关键字在列名中未能转义的问题。(Idbed4b/197133152)
版本 2.4.0-beta01
2021年10月13日
androidx.room:room-*:2.4.0-beta01
已发布。版本 2.4.0-beta01 包含这些提交。
Bug 修复
- 修复了自动迁移中的一个问题,即当同一自动迁移中的另一个表也有同名新列时,不会添加新列。(Ia5db5, b/200818663)
- room-paging 生成的 PagingSource 实现现在使用通过
RoomDatabase.Builder
传递的queryExecutor
,因此可以覆盖它,而不是以前的Dispatchers.IO
。(Iae259)
版本 2.4.0-alpha05
2021年9月29日
androidx.room:room-*:2.4.0-alpha05
已发布。版本 2.4.0-alpha05 包含这些提交。
新功能
- 为 UUID 添加了内置类型转换器。(I671e8, b/73132006)
API 变更
在
TypeConverters
注解中添加了一个新属性,允许开发者禁用内置的 Enum 和 UUID 转换器。默认情况下,这些转换器是启用的,但您可以为特定范围或整个数据库禁用它们。有关详细信息,请参阅TypeConverters
文档。(36ae9e, b/195413406)通过
@MapInfo
注解,在 DAO 中支持 Multimap 返回类型的非 POJO 键/值。(I4d704)
当映射的键或值列来自单个列时,将需要 @MapInfo
。请参阅示例。
@MapInfo(valueColumn = "songCount")
@Query("""
SELECT *, COUNT(mSongId) as songCount
FROM Artist JOIN Song ON Artist.artistName = Song.artist
GROUP BY artistName
""")
fun getArtistAndSongCounts(): Map<Artist, Integer>
- 当将 Paging3 与 Room 结合使用时,使
room-paging
成为必需的 Artifact。(Ieaffe)
Bug 修复
- 修复了当查询包含来自映射键的列的 ORDER BY 子句时,多映射查询结果排序不正确的问题。(I6b887)
外部贡献
- 添加了新 API 以指定
@Index
中的索引顺序。感谢 Nikita Zhelonkin。(I033fc)
版本 2.4.0-alpha04
2021 年 7 月 21 日
androidx.room:room-*:2.4.0-alpha04
已发布。 版本 2.4.0-alpha04 包含这些提交。
新功能
Room 现在支持
@Dao
方法的多映射返回类型,这对于 JOIN 语句很有用。支持的多映射类型包括Map
以及 Guava 的ImmutableMap
、ImmutableSetMultimap
和ImmutableListMultimap
。以下是多映射查询的示例:
一对一关系映射
@Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId") fun getSongAndArtist(): Map<Song, Artist>
一对多关系映射(标准多映射)
@Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId") fun getArtistAndAlbums(): Map<Artist, List<Album>>
多映射结果也可以包装在支持的异步返回类型中,例如
LiveData
、Rx 的Observable
或协程的Flow
。
Room-Paging
androidx.room:room-paging
已发布,为返回androidx.paging.PagingSource
的 Room 查询提供原生的 Paging 3.0 支持。@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun loadUsers(): PagingSource<Int, User> }
此 Artifact 将 Room 生成的
androidx.paging.PagingSource
实现替换为基于 Paging 3.0 API 构建的实现。新的 PagingSource 实现解析键的方式不同,因此任何手动提供给 Room 的 PagingSource 的键都需要考虑此行为更改,包括通过 Pager 构造函数传递的 initialKey。页面将从Key
开始加载,其中Key
是第一个加载的项。这与现有行为有所不同,现有行为中LoadParams.Refresh.Key
被视为用户的滚动位置,并且在键的前后都会加载项。该 Artifact 是可选的,选择不使用将回退到 Room 2.3 中引入的现有 Paging 3.0 支持。但是,对于那些将 Room 与 Paging 3.0 一起使用的人来说,此 Artifact 在未来版本中将变为非可选。要选择使用,请将新的 room-paging Artifact 添加到您的 classpath。如果您使用 Gradle,可以将以下代码段添加到您的 build.gradle 中:
dependency { implementation("androidx.room:room-paging:2.4.0-alpha04") }
Bug 修复
- 修复了自动迁移中处理外键冲突的问题。(b/190113935)
版本 2.4.0-alpha03
2021 年 6 月 16 日
androidx.room:room-*:2.4.0-alpha03
已发布。 版本 2.4.0-alpha03 包含这些提交。
API 变更
- 更新 Room 的
MigrationTestHelper
以支持自动迁移,方法是提供一个接收被测试数据库类的新构造函数 API。这允许辅助程序在runMigrationsAndValidate
期间以相同的方式自动添加自动迁移。
Bug 修复
修复了 Room 的 SQLite 原生库支持 Apple M1 芯片的问题。(b/174695268
修复了当
@Transaction
函数的返回类型为 Flow 时 Room 不会报错的问题。(I56ddd, b/190075899)修复了自动迁移中关于索引的问题。b/177673291
依赖项更新
- Room 的 KSP 支持现在依赖于 KSP
1.5.10-1.0.0-beta01
。(1ecb11, b/160322705)
版本 2.4.0-alpha02
2021 年 5 月 5 日
androidx.room:room-*:2.4.0-alpha02
已发布。 版本 2.4.0-alpha02 包含这些提交。
API 变更
@ProvidedAutoMigrationSpec
是一个新 API,用于声明AutoMigrationSpec
将在运行时通过RoomDatabase.Builder#addAutoMigrationSpec()
提供。这允许依赖注入框架在需要复杂依赖项时提供此类规范。
Bug 修复
- 修复了自动迁移中
@DatabaseView
未正确重新创建的问题。
外部贡献
- 修复了 Room 的
JournalMode.TRUNCATE
中InvalidationTracker
回调有时会被无效、过晚或根本不调用的问题。感谢Uli Bubenheimer | bubenheimer@users.noreply.github.com
(b/154040286)
版本 2.4.0-alpha01
2021 年 4 月 21 日
androidx.room:room-*:2.4.0-alpha01
已发布。 版本 2.4.0-alpha01 包含这些提交。
新功能
- 自动迁移:Room 现在提供了一个 API,只要导出模式,就可以自动生成迁移。为了让 Room 知道它应该生成自动迁移,可以使用新的属性
@Database#autoMigrations
来声明自动迁移的源版本和目标版本。当 Room 需要关于表和列重命名或删除的额外信息时,@AutoMigration
注解可以声明一个包含此类输入的规范类。有关更多详细信息,请参阅@AutoMigration
文档。
Bug 修复
- 修复了 Room 的模式验证错误地验证带有额外括号的
defaultValue
的问题。b/182284899
版本 2.3.0
版本 2.3.0
2021 年 4 月 21 日
androidx.room:room-*:2.3.0
已发布。 版本 2.3.0 包含这些提交。
自 2.2.0 以来的重要变更
- 内置枚举支持:如果未提供类型转换器,Room 现在默认使用 Enum 到 String 和 String 到 Enum 的类型转换器。如果枚举的类型转换器已经存在,Room 将优先使用它而不是默认转换器。
- 查询回调:Room 现在提供了一个通用的回调 API
RoomDatabase.QueryCallback
,用于查询即将执行时,这对于调试构建中的日志记录很有用。可以通过RoomDatabase.Builder#setQueryCallback()
设置回调。 - 预打包改进:Room 现在具有通过从输入流读取的预打包数据库创建数据库的 API。这允许在预打包数据库是 gzip 压缩的情况下使用。
- 提供的类型转换器:Room 现在具有用于提供类型转换器实例的 API,以便应用程序可以控制它们的初始化。要标记将提供给 Room 的类型转换器,请使用新的注解
@ProvidedTypeConverter
。 - RxJava3 支持:Room 现在支持 RxJava3 类型。与 RxJava2 类似,您可以声明返回类型为 Flowable、Single、Maybe 和 Completable 的 DAO 方法。此外,新的 artifact
androidx.room:room-rxjava3
可用于支持 RxJava3。 - Paging 3.0 支持:Room 现在将支持为返回类型为
androidx.paging.PagingSource
的@Query
注解方法生成实现。
版本 2.3.0-rc01
2021 年 3 月 24 日
androidx.room:room-*:2.3.0-rc01
已发布。 版本 2.3.0-rc01 包含这些提交。
Bug 修复
- 修复了阻止 Room 创建的 Coroutine Flow 查询在挂起
withTransaction
块中被消费的问题。(I797bf)
版本 2.3.0-beta03
2021 年 3 月 10 日
androidx.room:room-*:2.3.0-beta03
已发布。 版本 2.3.0-beta03 包含这些提交。
新功能
- 添加了对 KSP 的增量编译支持。(I031c1, b/176453350)
Bug 修复
- 修复了在主线程上创建 PagingSource 可能会触发 ANR 的错误。(I42b74, b/181221318)
- 修复了
@ExperimentalRoomApi
可见性从包私有变为公共的问题。(b/181356119)
外部贡献
- 允许 Room 在
@Query
注解的 DAO 方法(当它也使用@SkipQueryVerification
注解时)中接受 POJO 返回类型。Room 将尽力将查询结果转换为 POJO 返回类型,其方式与@RawQuery
注解的 DAO 方法相同。感谢 ‘Markus Riegel | hey@marcorei.com’。(I45acb)
版本 2.3.0-beta02
2021 年 2 月 18 日
androidx.room:room-*:2.3.0-beta02
已发布。 版本 2.3.0-beta02 包含这些提交。
新功能
Room 现在对 Kotlin Symbol Processing KSP 提供实验性支持。
KSP 是 KAPT 的替代品,用于在 Kotlin 编译器上原生运行注解处理器,显著缩短构建时间。
要将 Room 与 KSP 一起使用,您可以应用 KSP Gradle 插件,并将构建文件中的
kapt
配置替换为ksp
。例如,将kapt 'androidx.room:room-compiler:2.3.0-beta02'
替换为ksp 'androidx.room:room-compiler:2.3.0-beta02'
。有关详细信息,请参阅 KSP 文档。请注意,由于 KSP 处于实验阶段,建议生产代码仍使用 KAPT。构建时间的减少仅适用于没有其他处理器使用 KAPT 的情况。有关已知问题,请参阅 b/160322705。
版本 2.3.0-beta01
2021 年 1 月 27 日
androidx.room:room-*:2.3.0-beta01
已发布。 版本 2.3.0-beta01 包含这些提交。
新功能
- 自动关闭数据库:Room 现在具有在给定时间后未访问的数据库自动关闭的功能。这是一个实验性功能,可以通过调用
RoomDatabase.Builder#setAutoCloseTimeout()
来启用。此功能对于具有多个数据库的应用程序很有用。
Bug 修复
- 修复了 Dao 方法中多个
@Update
或@Delete
方法带有不同冲突策略时,只生成其中一种策略的代码,从而有效地忽略了定义的策略的问题。(/I0b90d, b/176138543)
版本 2.3.0-alpha04
2020 年 12 月 16 日
androidx.room:room-*:2.3.0-alpha04
已发布。 版本 2.3.0-alpha04 包含这些提交。
新功能
- Room 现在提供了一个通用的回调 API
RoomDatabase.QueryCallback
,用于查询即将执行时,这对于调试构建中的日志记录很有用。可以通过RoomDatabase.Builder#setQueryCallback()
设置回调。(Iaa513, b/174478034, b/74877608) - Room 现在默认使用 Enum 到 String 和 String 到 Enum 的类型转换器(如果未提供)。如果枚举的类型转换器已经存在,Room 将优先使用它而不是默认转换器。(b/73132006)
已知问题
- 如果 Enum 已经存在一个用于读取的单向类型转换器,Room 可能会意外地使用内置的 String 到 Enum 转换器,这可能不是预期行为。这是一个已知问题,可以通过将其更改为双向转换器来解决。请参阅:b/175707691
Bug 修复
- 修复了 Room 在较新 JDK 版本中错误禁用增量注解处理的问题。(b/171387388)
- 修复了在使用多个类加载器时 Room 查找生成类的问题。感谢 ‘Serendipity | 892449346@qq.com’ 的修复!(b/170141113)
- 修复了当 Kotlin
@Dao
具有泛型在 JVM 中为基本类型的基类时,Room 生成不正确代码的问题。(b/160258066)
外部贡献
- 如果 WAL 模式已启用且 API 版本为 16 或更高,Room 现在默认使用
beginTransactionNonExclusive
。感谢 ‘Ahmed I. Khalil | ahmedibrahimkhali@gmail.com’!(b/126258791)
版本 2.3.0-alpha03
2020 年 10 月 14 日
androidx.room:room-*:2.3.0-alpha03
已发布。 版本 2.3.0-alpha03 包含这些提交。
新功能
Room 现在提供了用于提供类型转换器实例的 API,以便应用程序可以控制它们的初始化。要标记将提供给 Room 的类型转换器,请使用新的注解
@ProvidedTypeConverter
。感谢 ‘mzgreen yairobbe@gmail.com’。(Ie4fa5, b/121067210)Room 现在具有通过从输入流读取的预打包数据库创建数据库的 API。这允许在预打包数据库是 gzip 压缩的情况下使用。感谢 ‘Ahmed El-Helw ahmedre@gmail.com’ (3e6792, b/146911060)
API 变更
添加了
@ForeignKey
注解缺失的 target,阻止了其在@Entity
注解之外的使用。(Iced1e)RoomDatabase.java
中的字段mCallbacks
现在已隐藏。(d576cb, b/76109329)
Bug 修复
更新了
TypeConverters
文档,以澄清 TypeConverters 只能用于转换列/字段,不能转换行。(I07c56, b/77307836)更新 DaoProcessor 以修复 Kotlin“基本类型”的泛型超类型 Dao 上的编译器错误。(Ice6bb, b/160258066)
更新 add/remove observer 方法文档以澄清线程问题(Ifd1d9, b/153948821)
修复了 Room 错误验证声明其 rowid 列的 FTS 表的问题。(d62ebc, b/145858914)
外部贡献
修复了与土耳其语相关的字母大小写区域设置问题(5746e3),b/68159494
将
RoomDatabase
中的ConcurrentHashMap
替换为Collections.synchronizedMap()
,以避免 Android Lollipop 上的问题(d1cfc7, b/162431855)添加了一个
onOpenPrepackagedDatabase
回调,用于复制预打包数据库时。(I1ba74, b/148934423)
版本 2.3.0-alpha02
2020 年 7 月 22 日
androidx.room:room-*:2.3.0-alpha02
已发布。 版本 2.3.0-alpha02 包含这些提交。
新功能
- RxJava3 支持:Room 现在支持 RxJava3 类型。与 RxJava2 类似,您可以声明返回类型为 Flowable、Single、Maybe 和 Completable 的 DAO 方法。此外,新的 artifact
androidx.room:room-rxjava3
可用于支持 RxJava3。(b/152427884)
API 变更
- 现在支持在 Kotlin Object 类中声明
@TypeConverter
。(b/151110764) Room
增量注解处理选项现在默认开启。(b/112110217)
版本 2.3.0-alpha01
2020 年 6 月 10 日
androidx.room:room-*:2.3.0-alpha01
已发布。 版本 2.3.0-alpha01 包含这些提交。
新功能
Paging 3.0 支持:Room 现在将支持为返回类型为
androidx.paging.PagingSource
的@Query
注解方法生成实现。@Dao interface UserDao { @Query("SELECT * FROM users ORDER BY id ASC") fun pagingSource(): PagingSource<Int, User> }
API 变更
@RewriteQueriesToDropUnusedColumns
是一个新的便捷注解,它使 Room 重写查询中的“*”投影,从而删除结果中未使用的列。- 处理器选项
room.expandProjection
现已弃用。请使用@RewriteQueriesToDropUnusedColumns
作为 Room 优化带有星形投影的查询的替代方案。请注意,@RewriteQueriesToDropUnusedColumns
并没有取代room.expandProjection
提供的关于包含@Embedded
字段的返回类型的列冲突解决方案。
Bug 修复
- 修复了 Room 无法正确检测用于启用增量注解处理器的 JDK 版本的问题。感谢 Blaz Solar (me@blaz.solar)(b/155215201)
- Room 现在将其 ANTLR 依赖项与注解处理器一起嵌入,以避免与其他也使用 ANTLR 的处理器发生版本冲突。(b/150106190)
版本 2.2.6
版本 2.2.6
2020 年 12 月 16 日
androidx.room:room-*:2.2.6
已发布。 版本 2.2.6 包含这些提交。
Bug 修复
- 修复了 Room 在较新 JDK 版本中错误禁用增量注解处理的问题。(b/171387388)
版本 2.2.5
版本 2.2.5
2020 年 3 月 18 日
androidx.room:room-*:2.2.5
已发布。 版本 2.2.5 包含这些提交。
Bug 修复
- 使
MultiInstanceInvalidationService
能够直接启动。感谢 ‘Mygod contact-git@mygod.be’(b/148240967) - 修复了启用多实例失效且数据库包含 FTS 实体时可能导致崩溃的错误。(b/148969394)
- 修复了 Room 注解处理器中加载 SQLite 原生库时的问题,该问题可能由于并行编译导致编译器崩溃。(b/146217083)
版本 2.2.4
版本 2.2.4
2020 年 2 月 19 日
androidx.room:room-common:2.2.4
、androidx.room:room-compiler:2.2.4
、androidx.room:room-guava:2.2.4
、androidx.room:room-ktx:2.2.4
、androidx.room:room-migration:2.2.4
、androidx.room:room-runtime:2.2.4
、androidx.room:room-rxjava2:2.2.4
和 androidx.room:room-testing:2.2.4
已发布。 版本 2.2.4 包含这些提交。
Bug 修复
- 修复了挂起事务的问题,如果协程在事务实际开始之前快速取消,它们会发生死锁。(b/148181325)
- 修复了使用 JDK 9 构建时
@Generated
错误使用的问题。(b/146538330) - 修复了当 Kotlin 中的 DAO 接口具有具体函数时 Room 生成不正确代码的问题。(b/146825845)
版本 2.2.3
版本 2.2.3
2019 年 12 月 18 日
androidx.room:room-*:2.2.3
已发布。 版本 2.2.3 包含这些提交。
Bug 修复
- 修复了 Room 在验证未经过任何迁移且模式中包含带有索引的旧哈希值的数据库时失败的错误。(b/139306173)
版本 2.2.2
版本 2.2.2
2019 年 11 月 20 日
androidx.room:room-*:2.2.2
已发布。 版本 2.2.2 包含这些提交。
Bug 修复
- 修复了在收集超过 999 行的一对一关系时,Room 会返回空相关项的错误。(b/143105450)
版本 2.2.1
版本 2.2.1
2019 年 10 月 23 日
androidx.room:room-*:2.2.1
已发布。 版本 2.2.1 包含这些提交。
Bug 修复
- 修复了当编译器选项
expandProjection
开启时,Room 会错误地警告CURSOR_MISMATCH
的错误。(b/140759491) - 添加了重试机制,用于处理编译时验证查询所需的缺失原生库。
版本 2.2.0
版本 2.2.0
2019 年 10 月 9 日
androidx.room:room-*:2.2.0
已发布。 版本 2.2.0 包含这些提交。
自 2.1.0 版以来的重要变更
- 预打包数据库:
RoomDatabase.Builder
中现在提供了两个新的 API,用于根据已填充的数据库文件创建RoomDatabase
。createFromAsset()
用于预填充数据库文件位于 APK 的资产文件夹中,而createFromFile()
用于文件位于任意位置。这些 API 的使用改变了破坏性迁移的行为,使得在回退迁移期间,如果可用,Room 将尝试重新复制预填充的数据库,否则它将回退到只删除和重新创建所有表。b/62185732 - Schema 默认值:
@ColumnInfo
现在有一个新属性defaultValue
,可用于指定列的默认值。默认值是数据库模式的一部分,如果指定,将在迁移期间进行验证。b/64088772 - 多对多关系:
@Relation
现在有一个新属性associateBy
,它接受一个新的注解@Junction
,用于声明需要通过连接表(也称为连接表)满足的关系。b/69201917 - 一对一关系:对使用
@Relation
注解的 POJO 字段必须是List
或Set
类型的限制已解除,从而允许表示单值关系。b/62905145 - 目标实体:DAO 注解
@Insert
、@Update
和@Delete
现在具有一个新属性targetEntity
,允许指定 DAO 方法要操作的目标表。这允许这些 DAO 方法的参数是任意 POJO,它们将被解释为部分实体。实际上,这允许部分插入、删除和更新。b/127549506 - 协程 Flow:
@Query
DAO 方法现在可以是返回类型为Flow<T>
。如果查询中观察的表失效,返回的 Flow 将重新发出新的值集。声明返回类型为Channel<T>
的 DAO 函数是错误的,Room 鼓励您使用Flow
,然后使用相邻函数将Flow
转换为Channel
。b/130428884 - Gradle 增量注解处理器:Room 现在是一个 Gradle 隔离注解处理器,可以通过处理器选项
room.incremental
启用增量性。有关详细信息,请参阅 Room 编译器选项。如果您遇到任何问题,请在此处提交错误报告。我们计划在未来的稳定版本中默认启用增量性。b/112110217 - 扩展投影:添加了一个新的实验性编译器选项
room.expandProjection
,它导致 Room 重写带有星号投影的查询,使其仅包含返回类型 POJO 中的列。例如,对于一个@Query("SELECT * FROM Song")
的 DAO 方法,它返回一个名为SongIdAndTitle
的 POJO,该 POJO 只有两个字段。然后 Room 将查询重写为SELECT id, title FROM Song
,以便获取满足返回类型的最小列集。这基本上消除了当查询返回与返回 POJO 类型中的任何字段不匹配的额外列时出现的CURSOR_MISMATCH
警告。
版本 2.2.0-rc01
2019 年 9 月 5 日
androidx.room:room:2.2.0-rc01
已发布。此版本中包含的提交可以在此处找到。
自 Room 2.2.0-beta01
以来没有公共变更。
版本 2.2.0-beta01
2019 年 8 月 22 日
androidx.room:room-*:2.2.0-beta01
已发布。此版本中包含的提交可以在此处找到。
Bug 修复
- 修复了协程 Flow 查询在一段时间后停止重新发出新值的错误。(b/139175786)
- 修复了 Room 在打开自 Room 1.0 以来未进行迁移的数据库时,不接受旧模式哈希代码,导致由于模式无效而运行时崩溃的错误。(b/139306173)
版本 2.2.0-alpha02
2019 年 8 月 7 日
androidx.room:room-*:2.2.0-alpha02
已发布。此版本中包含的提交可以在此处找到。
新功能
- 协程 Flow:
@Query
DAO 方法现在可以是返回类型为Flow<T>
。如果查询中观察的表失效,返回的 Flow 将重新发出新的值集。声明返回类型为Channel<T>
的 DAO 函数是错误的,Room 鼓励您使用Flow
,然后使用相邻函数将Flow
转换为Channel
。b/130428884 - 扩展投影:添加了一个新的实验性编译器选项
room.expandProjection
,它导致 Room 重写带有星号投影的查询,使其仅包含返回类型 POJO 中的列。例如,对于一个@Query("SELECT * FROM Song")
的 DAO 方法,它返回一个名为SongIdAndTitle
的 POJO,该 POJO 只有两个字段。然后 Room 将查询重写为SELECT id, title FROM Song
,以便获取满足返回类型的最小列集。这基本上消除了当查询返回与返回 POJO 类型中的任何字段不匹配的额外列时出现的CURSOR_MISMATCH
警告。 onDestructiveMigrate
是RoomDatabase.Callback
中添加的一个新回调 API,用于 Room 破坏性迁移数据库时。b/79962330
Bug 修复
- 修复了 Room 在字段受保护时,错误地使用方法作为字段 setter 生成不正确代码的错误。b/136194628
- 修复了当启用多实例失效且失效服务被终止时,InvalidationTracker 在第二个进程中抛出 NPE 的错误。b/137454915
- 修复了 Room 无法正确识别带有
@RawQuery
注解的继承挂起函数的返回类型的错误。b/137878827 - 更新了
@Relation
的生成代码,当关联键为 BLOB 类型时,使用可比较的ByteBuffer
。b/137881998 - 修复了 Room 抱怨用于
@Insert
、@Update
和@Delete
的部分实体参数的 POJO 中缺少 setter 的错误。b/138664463 - 修复了当实体类在某些 DAO 方法中使用时,Room 会抱怨通过
@Entity
忽略的列缺少 getter 和 setter 的错误。b/138238182 - 修复了 Room 在执行带有重复参数的查询时,不会正确地将命名绑定参数转换为位置参数,从而导致运行时异常的错误。b/137254857
版本 2.2.0-alpha01
2019 年 7 月 10 日
新功能
- 预打包数据库:
RoomDatabase.Builder
中现在提供了两个新的 API,用于根据已填充的数据库文件创建RoomDatabase
。createFromAsset()
用于预填充数据库文件位于 APK 的资产文件夹中,而createFromFile()
用于文件位于任意位置。这些 API 的使用改变了破坏性迁移的行为,使得在回退迁移期间,如果可用,Room 将尝试重新复制预填充的数据库,否则它将回退到只删除和重新创建所有表。b/62185732 - Schema 默认值:
@ColumnInfo
现在有一个新属性defaultValue
,可用于指定列的默认值。默认值是数据库模式的一部分,如果指定,将在迁移期间进行验证。b/64088772注意:如果您的数据库模式已经有默认值,例如通过
ALTER TABLE x ADD COLUMN y INTEGER NOTNULL DEFAULT z
添加的默认值,并且您决定通过@ColumnInfo
为相同列定义默认值,那么您可能需要提供一个迁移来验证未计入的默认值。有关详细信息,请参阅 Room 迁移。 - 多对多关系:
@Relation
现在有一个新属性associateBy
,它接受一个新的注解@Junction
,用于声明需要通过连接表(也称为连接表)满足的关系。b/69201917 - 一对一关系:对使用
@Relation
注解的 POJO 字段必须是List
或Set
类型的限制已解除,从而允许表示单值关系。b/62905145 - 目标实体:DAO 注解
@Insert
、@Update
和@Delete
现在具有一个新属性targetEntity
,允许指定 DAO 方法要操作的目标表。这允许这些 DAO 方法的参数是任意 POJO,它们将被解释为部分实体。实际上,这允许部分插入、删除和更新。b/127549506 - Gradle 增量注解处理器:Room 现在是一个 Gradle 隔离注解处理器,可以通过处理器选项
room.incremental
启用增量性。有关详细信息,请参阅 Room 编译器选项。如果您遇到任何问题,请在此处提交错误报告。我们计划在未来的稳定版本中默认启用增量性。b/112110217
Bug 修复
- 当查询的 Rx 流在查询完成之前已被处置时,Room 将不再将
EmptySetResultException
传播到全局错误处理程序。b/130257475 - 修复了 Room 在带有
@RawQuery
注解的挂起 DAO 函数没有返回类型时显示错误消息不正确的错误。b/134303897 - Room 将不再生成带有原始类型的 DAO 适配器。b/135747255
版本 2.1.0
版本 2.1.0
2019 年 6 月 13 日
Room 2.1.0 已发布,与 2.1.0-rc01
相比没有变化。此版本中包含的提交可以在此处找到。
自 2.0.0 以来的重要变更
- FTS:Room 现在支持具有映射 FTS3 或 FTS4 表的实体。使用
@Entity
注解的类现在可以额外使用@Fts3
或@Fts4
注解,以声明具有映射全文搜索表的类。通过注解的方法可以使用 FTS 选项进行进一步自定义。 - 视图:Room 现在支持使用
@DatabaseView
注解将类声明为存储查询,也称为视图。 - 协程:DAO 方法现在可以是挂起函数。在您的依赖项中包含
room-ktx
以利用此功能。ktx artifact 还提供了扩展函数RoomDatabase.withTransaction
,用于在协程中执行数据库事务。 - Auto Value:Room 现在支持将 AutoValue 注解的类声明为实体和 POJO。Room 注解
@PrimaryKey
、@ColumnInfo
、@Embedded
和@Relation
现在可以在 Auto Value 注解类的抽象方法中声明。请注意,这些注解还必须附带@CopyAnnotations
,Room 才能正确理解它们。 - 额外的异步支持:使用
@Insert
、@Delete
或@Update
注解的 DAO 方法,以及包含INSERT
、DELETE
或UPDATE
语句的@Query
,现在支持 Rx 返回类型Completable
、Single
、Maybe
和 Guava 的返回类型ListenableFuture
,它们也可以是挂起函数。 enableMultiInstanceInvalidation
是RoomDatabase.Builder
中用于启用使用相同数据库文件在多个 RoomDatabase 实例之间进行失效的新 API。fallbackToDestructiveMigrationOnDowngrade
是RoomDatabase.Builder
中的新 API,用于在发生降级时自动重新创建数据库。ignoredColumns
是@Entity
注解中的新 API,可用于按名称列出忽略的字段。- Room 现在将正确使用 Kotlin 数据类中的主构造函数,避免需要将属性声明为
vars
。
版本 2.1.0-rc01
2019 年 5 月 29 日
Bug 修复
- 修复了 Room 初始化错误,该错误可能由于已设置的 temp_store 配置而发生。b/132602198
- 修复了 SQLite 3.27.0 及更高版本用户关于双引号使用警告的问题。b/131712640
- 修复了当多个失效检查并行发生时 InvalidationTracker 会导致崩溃的错误。b/133457594
版本 2.1.0-beta01
2019 年 5 月 7 日
androidx.room 2.1.0-beta01
已发布,与 2.1.0-alpha07 相比没有变化。此版本中包含的提交可以在此处找到。
版本 2.1.0-alpha07
2019 年 4 月 25 日
API/行为变更
- 扩展函数
RoomDatabase.withTransaction
已更改为不再接受带有CoroutineScope
作为接收器的函数块。这避免了在事务块中并发运行事物所需的额外coroutineScope { }
包装器。
Bug 修复
- 修复了 Room 在 Kotlin DAO 函数中包含 Collection 类型参数时无法匹配 TypeConverter 的错误。b/122066791
版本 2.1.0-alpha06
2019 年 3 月 22 日
API/行为变更
- 异步事务查询现在是串行化的,这样 Room 就不会使用超过一个线程来执行数据库事务。
RoomDatabase.Builder.setTransactionExecutor(Executor)
已添加,允许配置用于事务的执行器。 RoomDatabase.runInTransaction(Callable)
将不再将检查异常包装到 RuntimeExceptions 中。b/128623748
Bug 修复
- 修复了当内容表和外部内容 FTS 表的观察者都添加时,失效跟踪器会停止观察内容表的错误。b/128508917
- 更新了
Room
SQLite 语法以匹配 SQLite 3.24.0。b/110883668
版本 2.1.0-alpha05
2019 年 3 月 13 日
新功能
- 扩展函数
RoomDatabase.withTransaction
允许您在协程中安全地执行数据库事务。Room 扩展函数以及协程支持可在room-ktx
artifact 中获得。 - 非抽象 DAO 方法(使用
@Transaction
注解)现在可以是挂起函数。b/120241587
API/行为变更
- artifact
room-coroutines
已更名为room-ktx
,与其它 androidx artifact 保持相同的命名。 RoomDatabase
中的beginTransaction
、setTransactionSuccessful
和endTransaction
已弃用,取而代之的是runInTransaction
和room-ktx
扩展函数withTransaction
。
Bug 修复
- 修复了如果使用的 tokenizer 是 SIMPLE,tokenizer 参数会被丢弃的错误。b/125427014
- 修复了 Room 无法正确识别类型为内部类的参数的挂起函数的错误。b/123767877
- 修复了带有
INSERT
、UPDATE
或DELETE
语句的延迟@Query
DAO 方法在主线程中急切准备查询的错误。b/123695593 - 修复了 Room 为某些挂起函数生成不正确代码的各种错误。b/123466702 和 b/123457323
- 修复了生成代码中未正确抑制方法弃用使用的问题。b/117602586
- Room 对 androidx.sqlite 的依赖已更新至 1.0.2,其中包含正确处理损坏数据库的修复。b/124476912
已知问题
- Room 2.1.0-alpha05 依赖于
kotlinx-metadata-jvm
artifact,该 artifact 目前在 Maven Central 中不可用(KT-27991)。可以通过将maven { url "https://kotlin.bintray.com/kotlinx/" }
添加到您的项目仓库来解决此依赖问题。
版本 2.1.0-alpha04
2019 年 1 月 25 日
新功能
- DAO 方法(使用
@Query
注解,包含INSERT
、UPDATE
或DELETE
语句)现在可以返回异步类型Single
、Mayble
、Completable
和ListenableFuture
。此外,它们也可以是挂起函数。b/120227284
API/行为变更
- 如果使用
@Transaction
注解的非抽象 DAO 方法返回异步类型(例如Single
、Mayble
、Completable
、LiveData
或ListenableFuture
),Room 现在将抛出错误。由于事务是线程受限的,Room 目前无法在可能在不同线程中执行查询的函数周围开始和结束事务。b/120109336 OnConflictStrategy.FAIL
和OnConflictStrategy.ROLLBACK
已被@Deprecated
,因为它们在 Android 当前的 SQLite 绑定中无法按预期工作。b/117266738
Bug 修复
- 修复了 Room 在 DAO 方法是挂起函数时无法正确使用返回类型 TypeConverter 的错误。b/122988159
- 修复了 Room 错误地将继承的挂起函数识别为非挂起函数的错误。b/122902595
- 修复了当
@Embedded
字段位于父类并在多个子类中使用时,Room 生成不正确代码的错误。b/121099048 - 修复了在
beginTransaction()
和endTransaction()
之间调用 DAO 挂起函数时数据库会死锁的问题。b/120854786
版本 2.1.0-alpha03
2018 年 12 月 4 日
API 变更
@Fts3
/@Fts4
中的 FTStokenizer
现在接受 String 而不是 Enum。这允许 Room 使用自定义 tokenizer。内置 tokenizer 仍定义在FtsOptions
中作为字符串常量。b/119234881
新功能
- 协程:DAO 方法现在可以是挂起函数。为了支持 Room 中的挂起函数,发布了一个新的 artifact
room-coroutines
。b/69474692 - 使用
@Insert
、@Delete
或@Update
注解的 DAO 方法现在支持ListenableFuture
作为返回类型。b/119418331
Bug 修复
- 修复了 Room 会错误地尝试在
@Entity
的ignoredColumns
属性中查找带有列的构造函数的错误。b/119830714 - 修复了 Room 不会在其生成实现中将 DAO 方法参数标记为 final 的错误。b/118015483
- 修复了当报告带有特殊符号的查询错误时
Room
处理器会崩溃的错误。b/119520136 - 修复了 Room 拒绝将其他各种
Collection
实现作为IN
表达式参数的错误。b/119884035 - 修复了从 Room 返回的 LiveData 在被永久观察时会被垃圾回收,导致不再发出新数据的错误。b/74477406
- 更新了
RoomDatabase
的关闭锁以减少锁竞争。b/117900450
版本 2.1.0-alpha02
2018 年 10 月 30 日
新功能
- 添加了在
@Relation
中引用@DatabaseView
的支持。b/117680932
Bug 修复
- 修复了 Room 在订阅和处置 Rx 返回类型时会在主线程中执行磁盘 I/O 的错误。b/117201279
- 修复了 Room 无法在 Kotlin 实体类中为字段找到合适类型转换器的错误。b/111404868
- 修复了 Room 为包含没有参数的 Kotlin 默认方法的
DAO
接口实现生成不正确代码的错误。b/117527454 - 更新了
Room
SQLite 语法解析器,修复了导致构建时间过长的性能问题。b/117401230
版本 2.1.0-alpha01
2018 年 10 月 8 日
新功能
- FTS:Room 现在支持具有映射 FTS3 或 FTS4 表的实体。使用
@Entity
注解的类现在可以额外使用@Fts3
或@Fts4
注解,以声明具有映射全文搜索表的类。通过注解的方法可以使用 FTS 选项进行进一步自定义。b/62356416 - 视图:Room 现在支持使用
@DatabaseView
注解将类声明为存储查询,也称为视图。b/67033276 - Auto Value:Room 现在支持将 AutoValue 注解的类声明为实体和 POJO。Room 注解
@PrimaryKey
、@ColumnInfo
、@Embedded
和@Relation
现在可以在 Auto Value 注解类的抽象方法中声明。请注意,这些注解还必须附带@CopyAnnotations
,Room 才能正确理解它们。b/62408420 - 额外的 Rx 返回类型支持:使用
@Insert
、@Delete
或@Update
注解的 DAO 方法现在支持 Rx 返回类型Completable
、Single<T>
和Maybe<T>
。b/63317956 @Relation
与不可变类型:Room 之前要求@Relation
注解的字段可设置,但现在它们可以是构造函数参数。enableMultiInstanceInvalidation
:是RoomDatabase.Builder
中的新 API,用于启用使用相同数据库文件的 RoomDatabase 多个实例之间的失效。此多实例失效机制也适用于多个进程。b/62334005fallbackToDestructiveMigrationOnDowngrade
:是RoomDatabase.Builder
中的新 API,用于在发生降级时自动重新创建数据库。b/110416954ignoredColumns
:是@Entity
注解中的新 API,可用于按名称列出忽略的字段。对于忽略实体上的继承字段很有用。b/63522075
API/行为变更
RoomDatabase
中的mCallback
和mDatabase
现在已@Deprecated
,并将在 Room 的下一个主要版本中移除。b/76109329
Bug 修复
- 修复了 Room 在初始化期间无法从损坏的数据库或错误的迁移中正确恢复的两个问题。b/111504749 和 b/111519144
- Room 现在将正确使用 Kotlin 数据类中的主构造函数,避免需要将字段声明为
vars
。b/105769985
版本 2.0.0
版本 2.0.0
2018 年 10 月 1 日
androidx.room 2.0.0
已发布,与 2.0.0-rc01 相比没有变化。
版本 2.0.0-rc01
2018 年 9 月 20 日
androidx.room 2.0.0-rc01
已发布,与 2.0.0-beta01 相比没有变化。
版本 2.0.0-beta01
2018 年 7 月 2 日
API/行为变更
- 添加了
RoomDatabase.Builder.setQueryExecutor()
以允许自定义查询运行位置 - 添加了 RxJava2
Observable
支持 - 生成的 DAO 和数据库实现现在是 final 的
Bug 修复
- 在“找不到字段的 getter”错误中指定类/字段名称 b/73334503
- 修复了 RoomOpenHelper 与旧版本 Room 的向后兼容性问题 b/110197391
AndroidX 之前的依赖项
对于 AndroidX 之前的 Room 版本,请包含这些依赖项
dependencies {
def room_version = "1.1.1"
implementation "android.arch.persistence.room:runtime:$room_version"
annotationProcessor "android.arch.persistence.room:compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor
// optional - RxJava support for Room
implementation "android.arch.persistence.room:rxjava2:$room_version"
// optional - Guava support for Room, including Optional and ListenableFuture
implementation "android.arch.persistence.room:guava:$room_version"
// Test helpers
testImplementation "android.arch.persistence.room:testing:$room_version"
}
版本 1.1.1
版本 1.1.1
2018 年 6 月 19 日
Room 1.1.1
与 Room 1.1.1-rc1
完全相同。
版本 1.1.1-rc1
2018 年 5 月 16 日 强烈建议您使用 Room 1.1.1-rc1
而不是 1.1.0
(如果您正在使用迁移)。
修复了 Room 无法正确处理迁移后初始化的问题 b/79362399
版本 1.1.0
版本 1.1.0-beta3
2018 年 4 月 19 日
Bug 修复
- 修复了 Kotlin POJO 引用在 Java 中定义的关联实体时出现的编译错误 b/78199923
版本 1.1.0-beta2
2018 年 4 月 5 日
Bug 修复
修复了
Room
RxSingle
和Maybe
实现中的一个严重错误,该错误会提前回收查询,导致如果您向返回的Single
或Maybe
实例添加多个观察者时出现问题。b/76031240[RoomDatabase.clearAllTables][ref-clearAllTables] 如果在事务内部调用,将不会
VACUUM
数据库。b/77235565
版本 1.1.0-beta1
2018 年 3 月 21 日
API 变更
- 根据 API 审查反馈,
@RawQuery
不再接受将String
作为查询参数传递。您需要使用 [SupportSQLiteQuery][ref-SupportSQLiteQuery]。(请参阅 [SimpleSQLiteQuery][ref-SimpleSQLiteQuery] 以轻松创建带有参数支持的 [SupportSQLiteQuery][ref-SupportSQLiteQuery] 实例)。 - RoomDatabase.Builder 的 [fallbackToDestructiveMigrationFrom][ref-fallbackToDestructiveMigrationFrom] 方法现在接受
vararg int
而不是vararg Integer
。
Bug 修复
- [RoomDatabase.clearAllTables][ref-clearAllTables] 现在通过设置 WAL 检查点和
VACUUM
数据库来尝试将空间返还给操作系统。 - [
@RawQuery
][ref-RawQuery] 现在接受任何 POJO 作为observedEntities
属性,只要该 POJO 通过其Embedded
字段或Relation
引用一个或多个实体。b/74041772 - Paging: Room 的 DataSource 实现现在正确处理多表依赖(例如关系和连接)。以前这些可能会无法触发新结果,或者可能无法编译。b/74128314
版本 1.1.0-alpha1
2018 年 1 月 22 日
新功能
RawQuery
:此新 API 允许@Dao
方法将 SQL 作为查询参数接收 b/62103290, b/71458963fallBackToDestructiveMigrationsFrom
:RoomDatabase.Builder
中的这个新 API 允许更精细地控制从哪些起始模式版本允许破坏性迁移(与 fallbackToDestructiveMigration 相比)b/64989640- Room 现在仅支持较新的 Paging API(alpha-4+),并放弃对已弃用的
LivePagedListProvider
的支持。要使用新的 Room alpha 版本,您需要使用 pagingalpha-4
或更高版本,并且如果您尚未这样做,则需要从LivePagedListProvider
切换到LivePagedListBuilder
。
Bug 修复
- 改进了对 Kotlin Kapt 类型的支持。b/69164099
- 字段顺序不再使模式失效。b/64290754