Room

Room 持久性库在 SQLite 之上提供了一个抽象层,以允许更可靠的数据库访问,同时充分利用 SQLite 的强大功能。
最新更新 稳定版 发布候选版本 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,@ConstructedByRoomDatabaseConstructor 来取代 instantiateImpl() 策略。新策略如下:

  1. 定义一个实现 RoomDatabaseConstructor 的 expect 对象

      expect object MyDatabaseCtor : RoomDatabaseConstructor<MyDatabase>
    
  2. 使用 @ConstructedBy 将该对象与 @Database 声明关联

      @Database(...)
      @ConstructedBy(MyDatabaseCtor::class) // NEW
      abstract class MyDatabase : RoomDatabase
    
  3. 创建一个新的数据库实例,但不传递工厂参数

      fun createNewDatabase(path: String) =
        Room.databaseBuilder<AppDatabase>(name = path)
          .setDriver(BundledSQLiteDriver())
          .setQueryCoroutineContext(Dispatchers.IO)
          .build()
    

修复了b/316978491b/338446862b/342905180 中的问题

  • 通过添加一个新 API RoomRawQuery 来支持 Room KMP 中的 @RawQuery,该 API 在保存原始 SQL 字符串和将参数绑定到语句的功能方面与 SupportSQLiteQuery 类似。带有 @RawQuery 注解的函数现在可以接受 RoomRawQuery 作为其唯一参数。(Iea844, b/330586815)
  • 添加一个接受 CoroutineContextsetQueryCallback() 重载。(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.useReaderConnectionRoomDatabase.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.ErrorLoadStateUpdate 传播。此错误状态可通过 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返回类型且表为空。在 Java CodeGen 中,这不会导致任何问题,但在 Kotlin CodeGen 中,您将收到错误。为了避免这种情况,您需要使用 Flow,假设发出了 null。

  • 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 包含这些提交。

新功能

  • DAO 函数中的嵌套 Map 返回类型现在在 Room 中受支持。(I13f48, 203008711)

API 变更

  • 创建了一个名为 @MapColumn 的新类型注解来替换已废弃的 @MapInfo。对于 @MapInfo 注解中提供的每个列名(keyColumnNamevalueColumnName 或两者),您需要声明一个只包含 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返回类型且表为空。在 Java CodeGen 中,这不会导致任何问题,但在 Kotlin CodeGen 中,您将收到错误。为了避免这种情况,您需要使用 Flow,假设发出了 null。

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.0androidx.room:room-paging-rxjava2:2.5.0androidx.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-rxjava2room-paging-rxjava3room-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 源代码中与 getOpenHelpergetQueryExecutorgetTransactionExecutor 的 getter / 属性不兼容的更改。(Iad0ac)

版本 2.5.0-alpha02

2022年6月1日

androidx.room:room-*:2.5.0-alpha02 已发布。版本 2.5.0-alpha02 包含这些提交。

新功能

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 语句很有用。支持的多映射类型包括 MapSparseArrayLongSparseArray,以及 Guava 的 ImmutableMapImmutableSetMultimapImmutableListMultimap

版本 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 包含这些提交。

新功能

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 的 ImmutableMapImmutableSetMultimapImmutableListMultimap

    以下是多映射查询的示例:

    一对一关系映射

    @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.TRUNCATEInvalidationTracker 回调有时会被无效、过晚或根本不调用的问题。感谢 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 包含这些提交。

新功能

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.4androidx.room:room-compiler:2.2.4androidx.room:room-guava:2.2.4androidx.room:room-ktx:2.2.4androidx.room:room-migration:2.2.4androidx.room:room-runtime:2.2.4androidx.room:room-rxjava2:2.2.4androidx.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,用于根据已填充的数据库文件创建 RoomDatabasecreateFromAsset() 用于预填充数据库文件位于 APK 的资产文件夹中,而 createFromFile() 用于文件位于任意位置。这些 API 的使用改变了破坏性迁移的行为,使得在回退迁移期间,如果可用,Room 将尝试重新复制预填充的数据库,否则它将回退到只删除和重新创建所有表。b/62185732
  • Schema 默认值@ColumnInfo 现在有一个新属性 defaultValue,可用于指定列的默认值。默认值是数据库模式的一部分,如果指定,将在迁移期间进行验证。b/64088772
  • 多对多关系@Relation 现在有一个新属性 associateBy,它接受一个新的注解 @Junction,用于声明需要通过连接表(也称为连接表)满足的关系。b/69201917
  • 一对一关系:对使用 @Relation 注解的 POJO 字段必须是 ListSet 类型的限制已解除,从而允许表示单值关系。b/62905145
  • 目标实体:DAO 注解 @Insert@Update@Delete 现在具有一个新属性 targetEntity,允许指定 DAO 方法要操作的目标表。这允许这些 DAO 方法的参数是任意 POJO,它们将被解释为部分实体。实际上,这允许部分插入、删除和更新。b/127549506
  • 协程 Flow@Query DAO 方法现在可以是返回类型为 Flow<T>。如果查询中观察的表失效,返回的 Flow 将重新发出新的值集。声明返回类型为 Channel<T> 的 DAO 函数是错误的,Room 鼓励您使用 Flow,然后使用相邻函数将 Flow 转换为 Channelb/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 转换为 Channelb/130428884
  • 扩展投影:添加了一个新的实验性编译器选项 room.expandProjection,它导致 Room 重写带有星号投影的查询,使其仅包含返回类型 POJO 中的列。例如,对于一个 @Query("SELECT * FROM Song") 的 DAO 方法,它返回一个名为 SongIdAndTitle 的 POJO,该 POJO 只有两个字段。然后 Room 将查询重写为 SELECT id, title FROM Song,以便获取满足返回类型的最小列集。这基本上消除了当查询返回与返回 POJO 类型中的任何字段不匹配的额外列时出现的 CURSOR_MISMATCH 警告。
  • onDestructiveMigrateRoomDatabase.Callback 中添加的一个新回调 API,用于 Room 破坏性迁移数据库时。b/79962330

Bug 修复

  • 修复了 Room 在字段受保护时,错误地使用方法作为字段 setter 生成不正确代码的错误。b/136194628
  • 修复了当启用多实例失效且失效服务被终止时,InvalidationTracker 在第二个进程中抛出 NPE 的错误。b/137454915
  • 修复了 Room 无法正确识别带有 @RawQuery 注解的继承挂起函数的返回类型的错误。b/137878827
  • 更新了 @Relation 的生成代码,当关联键为 BLOB 类型时,使用可比较的 ByteBufferb/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,用于根据已填充的数据库文件创建 RoomDatabasecreateFromAsset() 用于预填充数据库文件位于 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 字段必须是 ListSet 类型的限制已解除,从而允许表示单值关系。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 方法,以及包含 INSERTDELETEUPDATE 语句的 @Query,现在支持 Rx 返回类型 CompletableSingleMaybe 和 Guava 的返回类型 ListenableFuture,它们也可以是挂起函数。
  • enableMultiInstanceInvalidationRoomDatabase.Builder 中用于启用使用相同数据库文件在多个 RoomDatabase 实例之间进行失效的新 API。
  • fallbackToDestructiveMigrationOnDowngradeRoomDatabase.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 中的 beginTransactionsetTransactionSuccessfulendTransaction 已弃用,取而代之的是 runInTransactionroom-ktx 扩展函数 withTransaction

Bug 修复

  • 修复了如果使用的 tokenizer 是 SIMPLE,tokenizer 参数会被丢弃的错误。b/125427014
  • 修复了 Room 无法正确识别类型为内部类的参数的挂起函数的错误。b/123767877
  • 修复了带有 INSERTUPDATEDELETE 语句的延迟 @Query DAO 方法在主线程中急切准备查询的错误。b/123695593
  • 修复了 Room 为某些挂起函数生成不正确代码的各种错误。b/123466702b/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 注解,包含 INSERTUPDATEDELETE 语句)现在可以返回异步类型 SingleMaybleCompletableListenableFuture。此外,它们也可以是挂起函数。b/120227284

API/行为变更

  • 如果使用 @Transaction 注解的非抽象 DAO 方法返回异步类型(例如 SingleMaybleCompletableLiveDataListenableFuture),Room 现在将抛出错误。由于事务是线程受限的,Room 目前无法在可能在不同线程中执行查询的函数周围开始和结束事务。b/120109336
  • OnConflictStrategy.FAILOnConflictStrategy.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 中的 FTS tokenizer 现在接受 String 而不是 Enum。这允许 Room 使用自定义 tokenizer。内置 tokenizer 仍定义在 FtsOptions 中作为字符串常量。b/119234881

新功能

  • 协程:DAO 方法现在可以是挂起函数。为了支持 Room 中的挂起函数,发布了一个新的 artifact room-coroutinesb/69474692
  • 使用 @Insert@Delete@Update 注解的 DAO 方法现在支持 ListenableFuture 作为返回类型。b/119418331

Bug 修复

  • 修复了 Room 会错误地尝试在 @EntityignoredColumns 属性中查找带有列的构造函数的错误。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 返回类型 CompletableSingle<T>Maybe<T>b/63317956
  • @Relation 与不可变类型:Room 之前要求 @Relation 注解的字段可设置,但现在它们可以是构造函数参数。
  • enableMultiInstanceInvalidation:是 RoomDatabase.Builder 中的新 API,用于启用使用相同数据库文件的 RoomDatabase 多个实例之间的失效。此多实例失效机制也适用于多个进程。b/62334005
  • fallbackToDestructiveMigrationOnDowngrade:是 RoomDatabase.Builder 中的新 API,用于在发生降级时自动重新创建数据库。b/110416954
  • ignoredColumns:是 @Entity 注解中的新 API,可用于按名称列出忽略的字段。对于忽略实体上的继承字段很有用。b/63522075

API/行为变更

  • RoomDatabase 中的 mCallbackmDatabase 现在已 @Deprecated,并将在 Room 的下一个主要版本中移除。b/76109329

Bug 修复

  • 修复了 Room 在初始化期间无法从损坏的数据库或错误的迁移中正确恢复的两个问题。b/111504749b/111519144
  • Room 现在将正确使用 Kotlin 数据类中的主构造函数,避免需要将字段声明为 varsb/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 Rx SingleMaybe 实现中的一个严重错误,该错误会提前回收查询,导致如果您向返回的 SingleMaybe 实例添加多个观察者时出现问题。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/71458963
  • fallBackToDestructiveMigrationsFromRoomDatabase.Builder 中的这个新 API 允许更精细地控制从哪些起始模式版本允许破坏性迁移(与 fallbackToDestructiveMigration 相比)b/64989640
  • Room 现在仅支持较新的 Paging API(alpha-4+),并放弃对已弃用的 LivePagedListProvider 的支持。要使用新的 Room alpha 版本,您需要使用 paging alpha-4 或更高版本,并且如果您尚未这样做,则需要从 LivePagedListProvider 切换到 LivePagedListBuilder

Bug 修复

  • 改进了对 Kotlin Kapt 类型的支持。b/69164099
  • 字段顺序不再使模式失效。b/64290754