Room

La biblioteca de persistencias de Room brinda una capa de abstracción para SQLite que permite acceder a la base de datos sin problemas y, al mismo tiempo, aprovechar toda la potencia de SQLite.
Actualización más reciente Versión estable Versión potencial Versión beta Versión alfa
30 de octubre de 2024 2.6.1 - - 2.7.0-alpha11

Cómo declarar dependencias

Para agregar una dependencia en Room, debes agregar el repositorio de Maven de Google a tu proyecto. Consulta el repositorio de Maven de Google para obtener más información.

Las dependencias de Room incluyen pruebas de migraciones de Room y Room RxJava.

Agrega las dependencias de los artefactos que necesites en el archivo build.gradle de tu app o módulo:

Kotlin

dependencies {
    val room_version = "2.6.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.6.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"
}

Para obtener información sobre el uso del complemento KAPT, consulta la documentación de KAPT.

Para obtener información sobre el uso del complemento KSP, consulta la documentación de inicio rápido de KSP.

Para obtener información acerca del uso de extensiones de Kotlin, consulta la documentación de ktx.

Para obtener más información sobre las dependencias, consulta Cómo agregar dependencias de compilación.

De manera opcional, para las bibliotecas que no sean de Android (es decir, módulos de Gradle únicos de Java o Kotlin), puedes contar con androidx.room:room-common para usar las anotaciones de Room.

Cómo configurar las opciones del compilador

Room tiene las siguientes opciones de procesador de anotaciones.

room.schemaLocation directory
Permite exportar esquemas de bases de datos a archivos JSON en el directorio determinado. Consulta Migraciones de Room para obtener más información.
room.incremental boolean
Habilita el procesador de anotaciones incrementales de Gradle. El valor predeterminado es true.
room.generateKotlin boolean
Genera archivos fuente de Kotlin en lugar de Java. Requiere KSP. El valor predeterminado es false. Consulta las notas de la versión 2.6.0 para obtener más detalles.

Usa el complemento de Gradle de Room

Con Room 2.6.0 y versiones posteriores, puedes usar el complemento de Gradle de Room para configurar opciones para el compilador de Room. El complemento configura el proyecto de modo que los esquemas generados (que son un resultado de las tareas de compilación y se consumen para las migraciones automáticas) estén configurados correctamente para tener compilaciones reproducibles y almacenables en caché.

Para agregar el complemento, define el complemento y su versión en el archivo de compilación de Gradle de nivel superior.

Groovy

plugins {
    id 'androidx.room' version "$room_version" apply false
}

Kotlin

plugins {
    id("androidx.room") version "$room_version" apply false
}

En el archivo de compilación de Gradle a nivel del módulo, aplica el complemento y usa la extensión room.

Groovy

plugins {
    id 'androidx.room'
}

android {
    ...
    room {
        schemaDirectory "$projectDir/schemas"
    }
}

Kotlin

plugins {
    id("androidx.room")
}

android {
    ...
    room {
        schemaDirectory("$projectDir/schemas")
    }
}

Es obligatorio configurar un schemaDirectory cuando se usa el complemento de Gradle de Room. Esto configurará el compilador de Room y las diversas tareas de compilación y sus backends (javac, KAPT, KSP) para generar archivos de esquemas en carpetas con variantes, por ejemplo, schemas/flavorOneDebug/com.package.MyDatabase/1.json. Estos archivos deben registrarse en el repositorio para que se usen en la validación y las migraciones automáticas.

Algunas opciones no se pueden configurar en todas las versiones del complemento de Gradle de Room, aunque son compatibles con el compilador de Room. En la siguiente tabla, se enumera cada opción y se muestra la versión del complemento de Gradle de Room que agregó compatibilidad para configurar esa opción con la extensión room. Si tu versión es anterior o si la opción aún no es compatible, puedes usar las opciones del procesador de anotaciones en su lugar.

Opción Desde la versión
room.schemaLocation (obligatorio) 2.6.0
room.incremental -
room.generateKotlin -

Cómo usar las opciones del procesador de anotaciones

Si no usas el complemento de Gradle de Room o si la opción que deseas no es compatible con tu versión del complemento, puedes configurar Room con las opciones del procesador de anotaciones, como se describe en Cómo agregar dependencias de compilación. La forma en que especificas las opciones de anotación depende de si usas KSP o KAPT para Room.

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...
                )
            }
        }
    }
}

Como room.schemaLocation es un directorio y no un tipo primitivo, es necesario usar un CommandLineArgumentsProvider cuando se agrega esta opción para que Gradle conozca este directorio cuando realice verificaciones actualizadas. En Cómo migrar tu base de datos de Room, se muestra una implementación completa de CommandLineArgumentsProvider que proporciona la ubicación del esquema.

Comentarios

Tus comentarios ayudan a mejorar Jetpack. Avísanos si descubres nuevos errores o tienes ideas para mejorar esta biblioteca. Consulta los errores existentes de esta biblioteca antes de crear uno nuevo. Puedes agregar tu voto a un error existente haciendo clic en el botón de la estrella.

Crear un error nuevo

Consulta la documentación sobre la Herramienta de seguimiento de errores para obtener más información.

Versión 2.7

Versión 2.7.0-alpha11

30 de octubre de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha11. La versión 2.7.0-alpha11 contiene estas confirmaciones.

Cambios en la API

  • Vuelve a revisar la firma del método convertRows() recién agregada para que sea una función de suspensión que reciba un RawRoomQuery para la paginación de habitaciones. (Ie57b5, b/369136627).

Correcciones de errores

  • Se corrigió el problema en room-paging por el que se generaba un código no válido cuando se usaba @Relation junto con PagingSource.

Versión 2.7.0-alpha10

16 de octubre de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha10. La versión 2.7.0-alpha10 contiene estas confirmaciones.

Cambios en la API

  • Crea la clase ByteArrayWrapper interna para admitir relaciones con ByteBuffer en plataformas que no sean Android ni JVM. (I75543, b/367205685).
  • Agrega SQLiteStatement.getColumnType() junto con las diversas constantes de resultados SQLITE_DATA_* para permitir la recuperación del tipo de datos de una columna. (I1985c, b/369636251).

Versión 2.7.0-alpha09

2 de octubre de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha09. La versión 2.7.0-alpha09 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un problema con la implementación de KMP de room-paging que causaba un Error code: 8, message: attempt to write a readonly database debido a que se iniciaba una transacción de escritura en una conexión de lectura. (b/368380988).

Versión 2.7.0-alpha08

18 de septiembre de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha08. La versión 2.7.0-alpha08 contiene estas confirmaciones.

Nuevas funciones

  • Se migraron los artefactos room-paging para que sean compatibles con KMP. (Ib8756, b/339934824).
  • La API invalidationTrackerFlow() se generalizó como una API propia como InvalidationTracker.createFlow() y ahora está disponible para conjuntos de orígenes que no son de Android en proyectos de KMP. (I1fbfa, (I8fb29), b/329291639, b/329315924)

Cambios en la API

  • Se quitaron o reemplazaron todas las advertencias y los mensajes de error de Room que usaban la palabra Cursor, ya que Cursor ya no es un término general preciso para usar en la versión de KMP de Room. (Id8cd9, b/334087492).

Correcciones de errores

  • Se solucionó un problema por el que Room KMP intentaba emitir código con UUID para plataformas que no eran de JVM. (b/362994709).
  • Se corrigió un problema con el complemento de Gradle de Room que causaba un error como "Cannot change attributes of configuration … after it has been locked for mutation" cuando se usaba en un proyecto de KMP con Compose multiplataforma. (b/343408758).

Versión 2.7.0-alpha07

21 de agosto de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha07. La versión 2.7.0-alpha07 contiene estas confirmaciones.

Nuevas funciones

  • El complemento de Gradle de Room ahora agregará automáticamente los esquemas exportados a las fuentes de recursos de la prueba de instrumentación de Android para que MigrationTestHelper pueda usarlos.

Correcciones de errores

  • Se corrigió un problema con el "real" generado de RoomDatabaseConstructor que no tenía el modificador "real" en la función initialize si esa función también se anulaba en la declaración "expect". (359631627).
  • Se corrigió un problema por el que el valor “real” generado de RoomDatabaseConstructor no coincidía con la visibilidad de la declaración “expect” (358138953).

Versión 2.7.0-alpha06

7 de agosto de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha06. La versión 2.7.0-alpha06 contiene estas confirmaciones.

Cambios en la API

  • Cambia la configuración de creación de instancias de un RoomDatabase en un proyecto de KMP.

Debido al modelo de compilación de Kotlin 2.0, la estrategia de hacer referencia a una función que se generará, llamada instantiateImpl(), ya es viable. Se presentan dos APIs nuevas, @ConstructedBy y RoomDatabaseConstructor, que reemplazan a la estrategia instantiateImpl(). La nueva estrategia es la siguiente:

  1. Define un objeto de espera que implemente RoomDatabaseConstructor.

      expect object MyDatabaseCtor : RoomDatabaseConstructor<MyDatabase>
    
  2. Vincula el objeto con la declaración @Database con @ConstructedBy

      @Database(...)
      @ConstructedBy(MyDatabaseCtor::class) // NEW
      abstract class MyDatabase : RoomDatabase
    
  3. Crea una instancia de base de datos nueva, pero sin pasar un argumento de fábrica

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

Se corrigieron b/316978491, b/338446862 y b/342905180.

  • Compatibilidad con @RawQuery en KMP de Room mediante la adición de una nueva API llamada RoomRawQuery, que es similar a SupportSQLiteQuery en términos de mantener la cadena de SQL sin procesar y una función para vincular argumentos en una instrucción. Las funciones con anotaciones @RawQuery ahora pueden aceptar un RoomRawQuery como su único parámetro. (Iea844, b/330586815).
  • Agrega una sobrecarga de setQueryCallback() que acepte un CoroutineContext. (Id66ff, b/309996304).
  • Se agregó compatibilidad con los destinos multiplataforma de Kotlin linuxArm64 (I139d3, b/338268719).

Correcciones de errores

  • Se solucionó un problema por el que Room generaba incorrectamente una llamada a recursiveFetchArrayMap en destinos que no tenían Android. (710c36, b/352482325).
  • Se solucionó un problema por el que, a veces, Room arrojaba una excepción sobre el tiempo de espera de una conexión en un proyecto de KMP. (fa72d0, b/347737870).
  • Se solucionó un problema en las migraciones automáticas que verificaban las claves externas demasiado pronto antes de que otras tablas cambiaran sus esquemas para cumplir con las nuevas claves externas. (7672c0, b/352085724).

Versión 2.7.0-alpha05

10 de julio de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha05. La versión 2.7.0-alpha05 contiene estas confirmaciones.

Cambios en la API

  • Se cambió el nombre de SQLiteKt por SQLite y el de BundledSQLiteKt por BundledSQLite (I8b501).

Correcciones de errores

  • Se corrigió un error por el que un RoomDatabase interbloqueaba o generaba un error con un tiempo de espera de conexión cuando se usaba AndroidSQLiteDriver.

Versión 2.7.0-alpha04

12 de junio de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha04. La versión 2.7.0-alpha04 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un problema en el que el procesador de anotaciones de Room generaba un código KMP incompatible cuando se definía un tipo de datos multimapa en un DAO (b/340983093).
  • Se corrigió un problema por el que Room no podía encontrar la implementación de la base de datos generada si la clase con anotaciones @Database no tenía un paquete. (b/342097292).
  • Se solucionó un problema por el que, a veces, habilitar el cierre automático y la invalidación de varias instancias causaban una ConcurrentModificationException cuando la base de datos se cerraba automáticamente por estar inactiva.

Versión 2.7.0-alpha03

29 de mayo de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha03. La versión 2.7.0-alpha03 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigieron varios problemas relacionados con Kotlin 2.0 y KSP 2.0. Ten en cuenta que Kotlin 2.0 con compatibilidad con KSP 2 no está completo y el equipo está trabajando en las diversas APIs y cambios de comportamiento en el nuevo compilador. (b/314151707).

Versión 2.7.0-alpha02

14 de mayo de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha02. La versión 2.7.0-alpha02 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigieron varios problemas de KSP.

Versión 2.7.0-alpha01

1 de mayo de 2024

Lanzamiento de androidx.room:room-*:2.7.0-alpha01. La versión 2.7.0-alpha01 contiene estas confirmaciones.

Nuevas funciones

  • Compatibilidad con Kotlin multiplataforma (KMP): En esta versión, Room se refactorizó para convertirse en una biblioteca de Kotlin multiplataforma (KMP). Aunque aún queda trabajo por hacer, esta versión presenta una nueva versión de Room en la que la mayoría de las funciones se “comunicó” (se hizo multiplataforma). Las plataformas compatibles actualmente son Android, iOS, JVM (computadoras), Mac nativa y Linux nativa. Las funciones que faltan en las plataformas compatibles recientemente se completarán en las próximas versiones de Room.

Para obtener más información sobre cómo comenzar a usar Room KMP, consulta la documentación oficial de Room KMP.

  • La generación de código de Kotlin en KSP se activó de forma predeterminada si el procesamiento se realiza a través de KSP. Para proyectos solo de KAPT o Java, Room seguirá generando fuentes de Java.

Cambios en la API

  • Se agregó una sobrecarga de Room.databaseBuilder() que toma un parámetro lambda que se debe usar con una función generada por Room para evitar el uso de reflexión cuando se crea una instancia de la implementación RoomDatabase generada. Ejemplo de uso:
Room.databaseBuilder<MyDatabase>(
    context = appContext,
    name = dbFilePath,
    factory =  { MyDatabase::class.instantiateImpl() }
)
  • Se agregó al compilador una API para configurar Room con un CoroutineContext: RoomDatabase.Builder.setQueryCoroutineContext. Ten en cuenta que un RoomDatabase solo se puede configurar con ejecutores que usan setQueryExecutor o con un contexto de corrutina, pero no con ambos.
  • Se agregó una API para configurar Room con un controlador SQLite: RoomDatabase.Builder.setDriver(). Para obtener más información sobre la API del controlador de SQLite, consulta la documentación de SQLite de KMP
  • Se agregaron APIs para acceder al SQLiteConnection subyacente desde las APIs del controlador: RoomDatabase.useReaderConnection y RoomDatabase.useWriterConnection.
  • Varias devoluciones de llamada relacionadas con Room ahora tienen una versión sobrecargada que recibe SQLiteConnection en lugar de SupportSQLiteDatabase. Se espera que se anulen cuando se realice la migración a un proyecto de KMP. Para obtener más información sobre cómo migrar los usos de Room en una app para Android a un módulo KMP común, consulta la guía de migración. Las devoluciones de llamada son las siguientes:
    • Migration.migrate(SQLiteConnection)
    • AutoMigrationSpec.onPostMigrate(SQLiteConnection)
    • RoomDatabase.Callback.onCreate(SQLiteConnection)
    • RoomDatabase.Callback.onDestructiveMigration(SQLiteConnection)
    • RoomDatabase.Callback.onOpen(SQLiteConnection)
  • El artefacto de KTX androidx.room:room-ktx se unió a androidx.room:room-runtime junto con todas sus APIs, y ahora está en blanco. Quítala de la lista de dependencias.

Versión 2.6

Versión 2.6.1

29 de noviembre de 2023

Lanzamiento de androidx.room:room-*:2.6.1. La versión 2.6.1 contiene estas confirmaciones.

Correcciones de errores

  • Se resolvió un problema en el código generado en el que el valor predeterminado de las columnas dobles en EntityCursorConverter se establecía en 0 en lugar de 0.0. También se incluyó una posible solución para un caso límite similar para las columnas de tipo flotante. (Id75f5, b/304584179).
  • Las excepciones que se arrojan de las cargas de PagingSource ahora se propagarán como un LoadStateUpdate de LoadResult.Error que contiene el Throwable. Este estado de error se puede observar a través de PagingDataAdapter.loadStateFlow(Views) o LazyPagingItems.loadState(Compose). Ten en cuenta que esto marca un cambio de comportamiento en el que, en el pasado, los errores de carga se propagaban como una excepción que generaba el método dao que activaba la carga. (I93887, b/302708983).

Versión 2.6.0

18 de octubre de 2023

Lanzamiento de androidx.room:room-*:2.6.0. La versión 2.6.0 contiene estas confirmaciones.

Cambios importantes desde la versión 2.5.0

  • La opción para habilitar la generación de código Kotlin (o "Kotlin CodeGen") ya está disponible en el KSP de Room. (4297ec0). Para activar Kotlin CodeGen en Room, agrega el nombre de la opción room.generateKotlin a tus opciones de procesador para KSP. Para obtener más detalles sobre cómo pasar opciones de procesador para KSP, consulta la documentación de KSP.

Nota: Cuando se usa Kotlin CodeGen, es importante tener en cuenta que se agregaron restricciones adicionales. No se permiten las propiedades abstractas como métodos get de DAO o consultas DAO en Kotlin CodeGen y, en su lugar, se espera que se reescriban como funciones para evitar la noción falsa de que el valor de propiedad es inmutable y tiene un resultado almacenado fijo. Otra restricción que se agregó es que ya no se permiten los tipos de objetos que devuelven colecciones Nullable en Room para Kotlin CodeGen.

Advertencia: Es posible que tus proyectos sean más estrictos en términos de nulabilidad cuando uses CodeGen de Kotlin. En Kotlin CodeGen, la nulidad de los argumentos de tipo es importante, mientras que en Java se ignora en su mayoría. Por ejemplo, supongamos que tienes un tipo de datos que se muestra como "Flow<foo\>" y la tabla está vacía. En Java CodeGen, esto no causará ningún problema, pero en Kotlin CodeGen, recibirás un error. Para evitar esto, deberás usar "Flow<foo?\>", suponiendo que se emite un valor nulo. </foo?\></foo\>

  • Se agregó a Room con el ID androidx.room el nuevo artefacto para el complemento de Gradle para Room, lo que resuelve varios problemas existentes en Room relacionados con la inclusión de entradas y salidas de esquemas a través de las opciones del procesador de anotaciones de Gradle. Para obtener más información, consulta las notas de la versión de Room 2.6.0-alpha02.
  • Ahora las clases de valor en las entidades de Room son compatibles con KSP. (4194095).
  • Los tipos que se muestran de mapas anidados en funciones DAO ahora son compatibles con Room. (I13f48, 203008711).

Versión 2.6.0-rc01

20 de septiembre de 2023

Lanzamiento de androidx.room:room-*:2.6.0-rc01. La versión 2.6.0-rc01 contiene estas confirmaciones.

Versión 2.6.0-beta01

23 de agosto de 2023

Lanzamiento de androidx.room:room-*:2.6.0-beta01. La versión 2.6.0-beta01 contiene estas confirmaciones.

Correcciones de errores

  • Controla la excepción de caso especial SQLite durante la inserción y actualización que se produce cuando se genera la excepción 2067 SQLITE_CONSTRAINT_UNIQUE durante una inserción y actualización. La inserción y actualización deben realizar una actualización. (If2849, b/243039555)

Versión 2.6.0-alpha03

9 de agosto de 2023

Lanzamiento de androidx.room:room-*:2.6.0-alpha03. La versión 2.6.0-alpha03 contiene estas confirmaciones.

Nuevas funciones

  • Los tipos de datos que se muestran de Map anidados en las funciones de DAO ahora son compatibles con Room. (I13f48, 203008711)

Cambios en la API

  • Se creó una nueva anotación de tipo llamada @MapColumn para reemplazar @MapInfo, que ahora dejó de estar disponible. Para cada nombre de columna (keyColumnName, valueColumnName o ambos) que se proporciona en una anotación @MapInfo, deberás declarar una anotación @MapColumn con solo columnName y usar la anotación en el argumento de tipo específico al que se hace referencia (la clave o el valor del mapa) en el tipo que se muestra de la función DAO. Esto se debe a que la anotación @MapColumn se usa directamente en el argumento de tipo dentro del tipo de datos que se muestra de una función DAO, en lugar de en la función en sí, como @MapInfo. Para obtener más información, consulta la documentación de @MapColumn. (Ib0305, b/203008711).
  • Se actualizaron los archivos de API para anotar la supresión de compatibilidad (I8e87a, b/287516207).
  • Se actualizaron las APIs del complemento de Gradle de Room para que no siempre requieran configuraciones por variante. Esto significa que el complemento puede aceptar una ubicación global para todas las variantes sin crear varios directorios, lo que permite migraciones más fluidas, pero que también es lo suficientemente flexible como para configurar manualmente tipos o esquemas de tipo de compilación y, al mismo tiempo, conservar los beneficios del complemento (compilaciones reproducibles y que se pueden almacenar en caché). (I09d6f, b/278266663).

Correcciones de errores

  • Se corrigió una posible vulnerabilidad de fuga de memoria en QueryInterceptorStatement. (I193d1).
  • Se corrigió el comportamiento incorrecto de la función QueryInterceptorDatabase execSQL(). (Iefdc8).

Versión 2.6.0-alpha02

21 de junio de 2023

Lanzamiento de androidx.room:room-*:2.6.0-alpha02. La versión 2.6.0-alpha02 contiene estas confirmaciones.

Complemento de Gradle de Room

Esta nueva versión contiene un artefacto nuevo para el complemento de Room para Gradle con el ID androidx.room, que resuelve varios problemas existentes en Room relacionados con tener entradas y salidas de esquemas a través de las opciones del procesador de anotaciones de Gradle. El complemento de Gradle de Room configura el proyecto de modo que los esquemas generados que se consumen para las migraciones automáticas y que son el resultado de las tareas de compilación estén configurados correctamente para tener compilaciones reproducibles y almacenables en caché. El complemento ofrece un DSL para configurar la ubicación del esquema base:

room {
    schemaDirectory("$projectDir/schemas/")
}

Luego, el complemento configurará el compilador de Room y las diversas tareas de compilación y sus backends (javac, KAPT, KSP) para que generen archivos de esquemas en carpetas con temas, es decir, schemas/flavorOneDebug/com.package.MyDatabase/1.json. Como de costumbre, estos archivos se registran en el repositorio para usarse en la validación y las migraciones automáticas. Cuando se migra al uso del complemento en lugar de las opciones del procesador de anotaciones, los archivos de esquema existentes se deben copiar en los directorios de variantes generados que crea el complemento. Esta es una operación de migración única que se debe realizar de forma manual. La documentación del esquema en developers.android.com se actualizará en el futuro una vez que se respondan los comentarios y el complemento alcance la estabilidad, así que pruébalo.

Cambios en la API

  • RoomDatabase.QueryCallback se definió como una interfaz funcional para permitir usos de conversiones de SAM. (Iab8ea, b/281008549).

Correcciones de errores

  • Se resolvió el problema que se generaba cuando se creaba una instancia de la base de datos en Robolectric después de la migración de las fuentes de Room de Java a Kotlin. (Ic053c, b/274924903).

Versión 2.6.0-alpha01

22 de marzo de 2023

Lanzamiento de androidx.room:room-*:2.6.0-alpha01. La versión 2.6.0-alpha01 contiene estas confirmaciones.

Nuevas funciones

  • Compatibilidad con clases de valor en Room para KSP Ahora Room puede admitir clases de valor en Entidades. (4194095).
  • La generación de código Kotlin(o "Kotlin CodeGen") ahora se puede habilitar en Room (4297ec0). Para activar Kotlin CodeGen en Room, agrega el nombre de opción room.generateKotlin a tus opciones de procesador para KSP. Para obtener más detalles sobre cómo pasar opciones de procesador para KSP, consulta la documentación de KSP.

Nota: Cuando usas Kotlin CodeGen, es importante tener en cuenta que se agregaron restricciones adicionales. No se permiten propiedades abstractas como getters o consultas de DAO en Kotlin CodeGen, y se espera que se vuelvan a escribir como funciones para evitar la noción falsa de que el valor de la propiedad es inmutable y tiene un resultado almacenado fijo. Otra restricción que se agregó es que ya no se permiten los tipos de objetos que devuelven colecciones Nullable en Room para CodeGen de Kotlin.

Advertencia: Es posible que tus proyectos sean más estrictos en términos de nulabilidad cuando uses Kotlin CodeGen. En Kotlin CodeGen, la nulabilidad de los argumentos de tipo es importante; esto se ignora en Java. Por ejemplo, supongamos que tienes un tipo de datos que se muestra como "Flow<foo\>" y la tabla está vacía. En Java CodeGen, esto no causará ningún problema, pero en Kotlin CodeGen, recibirás un error. Para evitar esto, deberás usar "Flow<foo?\>", suponiendo que se emite un valor nulo. </foo?\></foo\>

Cambios en la API

  • Evita el uso sin sentido de colecciones nullable en los tipos de datos que devuelven los métodos de DAO. (I777dc, b/253271782, b/259426907).
  • Se agregó una API para crear un flujo que emite cambios del rastreador de invalidación. La API es útil para crear transmisiones que deben reaccionar a los cambios en la base de datos. (I8c790, b/252899305).

Correcciones de errores

  • No se permiten propiedades abstractas como getters o consultas de DAO en la generación de código de Kotlin. En su lugar, deben reescribirse como funciones para evitar la noción falsa de que el valor de la propiedad es inmutable y tiene un resultado almacenado fijo. (If6a13, b/127483380, b/257967987)

Versión 2.5.2

Versión 2.5.2

21 de junio de 2023

Lanzamiento de androidx.room:room-*:2.5.2. La versión 2.5.2 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un problema de incompatibilidad con kotlinx-metadata-jvm. (386d5c).
  • Se corrigió un problema que causaba que Room arrojara un error cuando se usaba en una prueba de Robolectric. (f79bea, b/274924903).

Versión 2.5.1

Versión 2.5.1

22 de marzo de 2023

Lanzamiento de androidx.room:room-*:2.5.1. La versión 2.5.1 contiene estas confirmaciones.

Correcciones de errores

  • Evita verificar el directorio superior de la base de datos en FrameworkSQLiteHelper si la base de datos ya está abierta. (5de86b8).
  • Usa una verificación isOpenInternal cuando compruebes si la base de datos ya está abierta. (e91fb35).
  • Ahora está disponible un mejor control del caso de reentrada en acquireTransactionThread() de Room. (219f98b). Durante una transacción de suspensión, Room usa un subproceso del ejecutor de transacciones, inicia un bucle de eventos en él y le envía operaciones de suspensión de la base de datos para que todas estén encapsuladas en la corrutina de la transacción. Por lo general, se espera que el subproceso de la transacción sea diferente del que la inicia, pero, en algunos casos, son iguales. Para controlar estos casos reentrantes, se refactorizó withTransaction() para que ya no dependa de un trabajo de control y, en su lugar, ejecute el bloque de suspensión de transacciones desde runBlocking en el subproceso de transacciones.

Versión 2.5.0

Versión 2.5.0

22 de febrero de 2023

Lanzamiento de androidx.room:room-paging-guava:2.5.0, androidx.room:room-paging-rxjava2:2.5.0 y androidx.room:room-paging-rxjava3:2.5.0. La versión 2.5.0 contiene estas confirmaciones.

Versión 2.5.0

11 de enero de 2023

Lanzamiento de androidx.room:room-*:2.5.0. La versión 2.5.0 contiene estas confirmaciones.

Cambios importantes desde 2.4.0

  • Todos los orígenes de room-runtime se convirtieron de Java a Kotlin Ten en cuenta que, si tu código está en Kotlin, es posible que encuentres problemas de incompatibilidad de origen debido a la conversión de la biblioteca a Kotlin. Por ejemplo, un cambio incompatible de origen conocido es que, en InvalidationTracker, ahora deberás declarar onInvalidate() en Observer para tener un parámetro de tipo Set, en lugar de MutableSet. Además, algunos métodos get se convirtieron en propiedades que requieren la sintaxis de acceso a las propiedades en archivos Kotlin. Informa un error si hay alguna incompatibilidad significativa.
  • Se agregó una nueva anotación de acceso directo, @Upsert, que intenta insertar una entidad cuando no hay conflicto de singularidad, o bien actualizar la entidad si es que lo hay (I7aaab, b/241964353).
  • Se agregaron los nuevos artefactos de room-paging room-paging-rxjava2, room-paging-rxjava3 y room-paging-guava para obtener compatibilidad con Paging de Room.
  • Se agregaron APIs para proporcionar nombres de tablas de clave y valor para la desambiguación en @MapInfo (Icc4b5).

Versión 2.5.0-rc01

7 de diciembre de 2022

Lanzamiento de androidx.room:room-*:2.5.0-rc01. La versión 2.5.0-rc01 contiene estas confirmaciones.

  • Esta versión es idéntica a la versión 2.5.0-beta02.

Versión 2.5.0-beta02

9 de noviembre de 2022

Se lanzó androidx.room:room-*:2.5.0-beta02. La versión 2.5.0-beta02 contiene estas confirmaciones.

Cambios en la API

  • Se corrigieron varias APIs que tomaban argumentos de consulta de invariantes (Array<Any?>) a contravariantes (Array<out Any?>) para que coincidan con el comportamiento del array de Java (b/253531073).

Versión 2.5.0-beta01

5 de octubre de 2022

Lanzamiento de androidx.room:room-*:2.5.0-beta01. La versión 2.5.0-beta01 contiene estas confirmaciones.

Cambios en la API

  • Restringe la versión mínima que admite @Upsert para que sea API 16. Esto se debe a la incapacidad de identificar un conflicto de restricción de clave primaria en APIs anteriores. (I5f67f, b/243039555)

Correcciones de errores

  • Se corrigió un problema en el que las tablas paralelas se exportaban de forma incorrecta a los archivos de esquema .json y se dañaban. (I4f83b, b/246751839)

Versión 2.5.0-alpha03

24 de agosto de 2022

Lanzamiento de androidx.room:room-*:2.5.0-alpha03. La versión 2.5.0-alpha03 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó una nueva anotación de acceso directo, @Upsert, que intenta insertar una entidad cuando no hay conflicto de singularidad, o bien actualizar la entidad si es que lo hay (I7aaab, b/241964353).

Correcciones de errores

  • Ahora Room mostrará una SQLiteConstraintException en lugar de una IllegalStateException durante la verificación automática de restricciones de clave externa (I328dd).
  • Se corrigió un cambio incompatible en el código fuente de Kotlin para el método get y las propiedades getOpenHelper, getQueryExecutor y getTransactionExecutor (Iad0ac).

Versión 2.5.0-alpha02

1 de junio de 2022

Se lanzó androidx.room:room-*:2.5.0-alpha02. La versión 2.5.0-alpha02 contiene estas confirmaciones.

Nuevas funciones

Cambios en la API

  • Todo el room-runtime se convirtió de Java a Kotlin (If2069, b/206859668),(Ie4b55, b/206859668), (I697ee, b/206859668), (I96c25, b/206859668).

    Nota: Es posible que encuentres problemas de incompatibilidad de origen debido a que la bibliotecas se convirtió a Kotlin. Si tu código estaba en Kotlin y llamaba a la versión anterior de Room, la nueva versión deberá controlar estos casos. Por ejemplo, un cambio incompatible de origen conocido es que, en InvalidationTracker, ahora deberás declarar onInvalidate() en Observer para tener un parámetro de tipo Set, en lugar de MutableSet.

  • Se agregaron APIs para proporcionar nombres de tablas de clave y valor para la desambiguación en @MapInfo (Icc4b5).
  • Se corrigió un problema de compatibilidad de origen para volver a permitir @Ignore en métodos get de propiedad (Ifc2fb).

Correcciones de errores

  • Se duplicó el algoritmo heurístico de resolución de columna. Ahora Room intentará resolver columnas ambiguas en una consulta multimapa. Esto permite que las JOIN con tablas que contienen tablas del mismo nombre se asignen correctamente a un objeto de datos de resultado (I4b444, b/201306012, b/212279118).

Versión 2.5.0-alpha01

23 de febrero de 2022

Lanzamiento de androidx.room:room-*:2.5.0-alpha01. La versión 2.5.0-alpha01 contiene estas confirmaciones.

Cambios en la API

  • Se corrigió un problema por el que no se aplicaba el uso de Room @IntDef en fuentes de Kotlin (I75f41, b/217951311).
  • Se corrigió un problema de compatibilidad de origen para volver a permitir @Query en métodos get de propiedad (I0a09b).
  • Se convirtió room-common de Java a Kotlin (I69c48, b/206858235).

    Nota: Es posible que encuentres problemas de incompatibilidad de fuente, ya que algunas propiedades se trasladaron a objetos complementarios durante la conversión de biblioteca a Kotlin. Si tu código estaba en Kotlin y llamaba a la versión anterior de Room, la nueva versión necesitará el sufijo ".Companion" cuando accedas a esas propiedades.

  • Se convirtió room-migration de Java a Kotlin (I2724b, b/206858622).
  • Se convirtieron los archivos relacionados con paging en room-runtime de Java a Kotlin (I82fc8, b/206859668).
  • Se agregó una API para el bloqueo y uso de varios procesos a nivel de FrameworkSQLite* a fin de proteger la primera creación de bases de datos y migraciones de varios procesos (Ied267, b/193182592).

Correcciones de errores

  • Se agregó compatibilidad para propiedades internas en fuentes de Kotlin. Este es un pequeño cambio de comportamiento en Room, en el que se usa el nombre de origen de las funciones y se hace coincidir con propiedades como métodos get y set (antes se usaba el nombre JVM de la función, que es diferente para funciones o propiedades internas). Si usas anotaciones @JvmName personalizadas para hacer coincidir los métodos get y set con propiedades privadas, vuelve a verificar el código que se generó después de la actualización (If6531, b/205289020).

Versión 2.4.3

Versión 2.4.3

27 de julio de 2022

Lanzamiento de androidx.room:room-*:2.4.3. La versión 2.4.3 contiene estas confirmaciones.

Correcciones de errores

  • Se solucionó un problema por el que Room no reconocía las funciones de suspensión en Kotlin 1.7 (b/236612358).

Versión 2.4.2

Versión 2.4.2

23 de febrero de 2022

Lanzamiento de androidx.room:room-*:2.4.2. La versión 2.4.2 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un problema que generaba código para una función de suspensión @Transaction de Dao con un cuerpo que creaba un método de interfaz predeterminado debido a la compilación con -Xjvm-default=all o un elemento equivalente (Ia4ce5).
  • Se resolvió un error por el que Room generaba código para un método de consulta que muestra el tipo de datos Array<ByteArray> (If086e, b/213789489).

Versión 2.4.1

Versión 2.4.1

12 de enero de 2022

Lanzamiento de androidx.room:room-*:2.4.1. La versión 2.4.1 contiene estas confirmaciones.

Correcciones de errores

  • Se agregó compatibilidad para propiedades internas en fuentes de Kotlin. Este es un pequeño cambio de comportamiento en Room, en el que se usa el nombre de origen de las funciones y se hace coincidir con propiedades como métodos get y set (antes se usaba el nombre JVM de la función, que es diferente para funciones o propiedades internas). Si usas anotaciones @JvmName personalizadas para hacer coincidir los métodos get y set con propiedades privadas, vuelve a verificar el código que se generó después de la actualización (If6531, b/205289020).

Versión 2.4.0

Versión 2.4.0

15 de diciembre de 2021

Lanzamiento de androidx.room:room-*:2.4.0. La versión 2.4.0 contiene estas confirmaciones.

Cambios importantes desde la versión 2.3.0

  • Migraciones automáticas: Ahora, Room ofrece una API para generar migraciones automáticamente siempre que se exporten esquemas. Si deseas indicarle a Room que debe generar una migración automática, se puede usar una nueva propiedad @Database#autoMigrations para declarar las versiones desde y hasta las cuales se realizará la migración automática. Cuando Room necesita información adicional sobre el cambio de nombre o la eliminación de tablas y columnas, la anotación @AutoMigration puede declarar una clase de especificación que contiene esas entradas. Para obtener más detalles, consulta la documentación de @AutoMigration.
  • Inserción de dependencias en migraciones automáticas: @ProvidedAutoMigrationSpec es una nueva API proporcionará una AutoMigrationSpec en el tiempo de ejecución a través de RoomDatabase.Builder#addAutoMigrationSpec(). De esta manera, un framework de inyección de dependencia puede proporcionar esas especificaciones cuando necesiten dependencias complejas.
  • Compatibilidad con el asistente de pruebas de migración para migraciones automáticas: Se actualizó el objeto MigrationTestHelper de Room para admitir migraciones automáticas mediante una nueva API de constructor que recibe la clase de base de datos en evaluación. Esto permite que el asistente agregue automáticamente migraciones automáticas de la misma manera durante runMigrationsAndValidate.
  • Compatibilidad con Room-Paging: Se lanzó androidx.room:room-paging, que proporciona compatibilidad nativa con Paging 3.0 para las consultas de Room que muestran androidx.paging.PagingSource.
  • Métodos de consulta relacionadas: Room ahora admite métodos @Dao que muestran tipos de datos multimapa, que son útiles para las instrucciones JOIN. Los tipos de multimapas compatibles son Map, SparseArray y LongSparseArray, además de ImmutableMap, ImmutableSetMultimap e ImmutableListMultimap de Guava.

Versión 2.4.0-rc01

1 de diciembre de 2021

Lanzamiento de androidx.room:room-*:2.4.0-rc01. La versión 2.4.0-rc01 contiene estas confirmaciones.

Nuevas funciones

  • Se actualizó la dependencia de Room en KSP a 1.6.0-1.0.1 para admitir Kotlin 1.6.

Versión 2.4.0-beta02

17 de noviembre de 2021

Lanzamiento de androidx.room:room-*:2.4.0-beta02. La versión 2.4.0-beta02 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó compatibilidad para SparseArray y LongSparseArray en @MapInfo. (Ic91a2b/138910317)

Correcciones de errores

  • Se agregó un nuevo analizador TypeConverter que toma en cuenta la información sobre la nulabilidad en tipos. Como esta información solo está disponible en KSP, se activa solo en KSP de forma predeterminada. Si se produce algún problema, puedes desactivarla si pasas room.useNullAwareTypeAnalysis=false al procesador de anotaciones. Si esto sucede, informa un error, ya que esta marca se quitará en el futuro. Con este nuevo analizador TypeConverter, te recomendamos que solo proporciones TypeConverter que no reciban valores nulos, ya que el nuevo analizador tiene la capacidad de unirlos con una verificación de nulabilidad. Ten en cuenta que no afecta a los usuarios que usan KAPT o Java, ya que los procesadores de anotaciones (a diferencia de KSP) no tienen información sobre la nulabilidad en tipos (Ia88f9, b/193437407).
  • Se corrigió un error por el que Room no podía hacer una compilación con un error de SQL cuando una entidad FTS declaraba usar el tokenizador de ICU (I00db9, b/201753224).
  • Se resolvió un problema en las migraciones automáticas relacionadas con una columna nueva que se agregaba a una entidad incorporada entre versiones (I5fcb1b/193798291).
  • Se resolvió un problema relacionado con los tipos de datos que muestran los métodos de consultas relacionales en las consultas LEFT JOIN. Con estos cambios, en los casos en que haya una asignación de uno a varios, la colección que se muestra para una clave no incluirá el objeto de valor no válido si no se encuentra en el cursor. Si no se encuentran valores válidos, la clave se asignará a una colección vacía (Id5552b/201946438).
  • Se resolvió el problema de migración automática por el que las palabras clave SQLite no se podían escapar en los nombres de las columnas (Idbed4b/197133152).

Versión 2.4.0-beta01

13 de octubre de 2021

Se lanzó androidx.room:room-*:2.4.0-beta01. La versión 2.4.0-beta01 contiene estas confirmaciones.

Correcciones de errores

  • Se solucionó un problema por el que las migraciones automáticas no agregaban columnas nuevas cuando otra tabla de la misma migración también tenía una columna nueva con el mismo nombre (Ia5db5, b/200818663).
  • La implementación de PagingSource que generaba la paginación de Room ahora usa el queryExecutor que pasa RoomDatabase.Builder, por lo que se puede anular, en lugar de Dispatchers.IO como era antes (Iae259).

Versión 2.4.0-alpha05

29 de septiembre de 2021

Lanzamiento de androidx.room:room-*:2.4.0-alpha05. La versión 2.4.0-alpha05 contiene estas confirmaciones.

Nuevas funciones

Cambios en la API

  • Se agregó una nueva propiedad a la anotación TypeConverters para permitir que los desarrolladores inhabiliten los convertidores Enum y UUID integrados. De forma predeterminada, estos convertidores están activados, pero puedes inhabilitarlos para un alcance determinado o para toda la base de datos. Consulta la documentación de TypeConverters para obtener más información. (36ae9e, b/195413406)

  • Compatibilidad con pares clave-valor que no son POJO para los DAO que muestran tipos de datos multimapa mediante la anotación @MapInfo (I4d704)

Se requerirá @MapInfo cuando la columna de clave o valor del mapa corresponda a una sola columna. Mira el ejemplo:

@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>
  • Haz que room-paging sea un artefacto obligatorio cuando uses Paging3 con Room. (Ieaffe)

Correcciones de errores

  • Se corrigió un problema en el que los resultados de las consultas multimapa no se ordenaban correctamente cuando la consulta contenía una cláusula ORDER BY de una columna de la clave del mapa. (I6b887)

Contribución externa

  • Se agregó una nueva API para especificar el orden de índices en @Index. Gracias a Nikita Zhelonkin. (I033fc)

Versión 2.4.0-alpha04

21 de julio de 2021

Lanzamiento de androidx.room:room-*:2.4.0-alpha04. La versión 2.4.0-alpha04 contiene estas confirmaciones.

Nuevas funciones

  • Ahora Room admite métodos @Dao que muestran tipos de datos multimapa, que son útiles para las instrucciones JOIN. Los tipos de multimapas compatibles son Map y también ImmutableMap, ImmutableSetMultimap o ImmutableListMultimap de Guava.

    Los siguientes son ejemplos de consultas multimapa:

    Mapa de relación de uno a uno

    @Query("SELECT * FROM Song JOIN Artist ON Song.artistId = Artist.artistId")
    fun getSongAndArtist(): Map<Song, Artist>
    

    Mapa de relación de uno a varios (multimapa estándar)

    @Query("SELECT * FROM Artist JOIN Album ON Artist.id = Album.artistId")
    fun getArtistAndAlbums(): Map<Artist, List<Album>>
    

    El resultado de multimapa también se puede unir en los tipos de datos asíncronos y compatibles que se muestran, como LiveData, Observable de Rx o Flow de corrutinas.

Room-Paging

  • Se lanza androidx.room:room-paging, que brinda compatibilidad nativa con Paging 3.0 para las consultas de Room que muestran androidx.paging.PagingSource.

    @Dao
    interface UserDao {
      @Query("SELECT * FROM users ORDER BY id ASC")
      fun loadUsers(): PagingSource<Int, User>
    }
    
  • Este artefacto reemplaza la implementación de androidx.paging.PagingSource que genera Room con una que se compila sobre las APIs de Paging 3.0. La implementación nueva de PagingSource analiza las claves de manera diferente, por lo que cualquier clave que se le brinde de forma manual a PagingSource de Room debería tener en cuenta este cambio de comportamiento, que incluye initialKey que se pasa a través del constructor de Pager. Las páginas comenzarán a cargarse desde el elemento Key, y Key será el primero que se cargue. Esto se desvía del comportamiento existente en el que LoadParams.Refresh.Key se trata como la posición de desplazamiento del usuario, y los elementos se cargan antes de la clave y después de esta.

  • El artefacto es opcional y, para inhabilitarlo, se recurrirá a la compatibilidad existente con Paging 3.0 que se introdujo en Room 2.3. Sin embargo, este artefacto dejará de ser opcional en una versión futura para quienes usen Room con Paging 3.0. Para habilitarlo, agrega el artefacto nuevo room-paging a la ruta de clase. Si usas Gradle, puedes agregar el siguiente fragmento a build.gradle:

    dependency {
      implementation("androidx.room:room-paging:2.4.0-alpha04")
    }
    

Correcciones de errores

  • Se solucionó un problema de las migraciones automáticas en relación con el control de incumplimientos de claves externas. (b/190113935)

Versión 2.4.0-alpha03

16 de junio de 2021

Lanzamiento de androidx.room:room-*:2.4.0-alpha03. La versión 2.4.0-alpha03 contiene estas confirmaciones.

Cambios en la API

  • Actualiza el objeto MigrationTestHelper de Room para admitir las migraciones automáticas mediante una API de constructor nueva que recibe la clase de base de datos en evaluación. Esto permite que el asistente agregue automáticamente migraciones automáticas de la misma manera durante runMigrationsAndValidate.

Correcciones de errores

  • Se solucionó un problema con la biblioteca nativa de SQLite de Room para admitir los chips M1 de Apple (b/174695268).

  • Se solucionó un problema por el que Room no generaba un error cuando el tipo de datos de @Transaction que se mostraba era un flujo (I56ddd, b/190075899).

  • Se corrigió un error en las migraciones automáticas relacionadas con índices (b/177673291).

Actualizaciones de dependencias

  • La compatibilidad con KSP de Room ahora depende de KSP 1.5.10-1.0.0-beta01 (1ecb11, b/160322705).

Versión 2.4.0-alpha02

5 de mayo de 2021

Lanzamiento de androidx.room:room-*:2.4.0-alpha02. La versión 2.4.0-alpha02 contiene estas confirmaciones.

Cambios en la API

  • @ProvidedAutoMigrationSpec es una API nueva destinada a declarar que se proporcionará una AutoMigrationSpec en el tiempo de ejecución a través de RoomDatabase.Builder#addAutoMigrationSpec(). De esta manera, un framework de inyección de dependencia puede proporcionar esas especificaciones cuando necesiten dependencias complejas.

Correcciones de errores

  • Se corrigió un error en las migraciones automáticas en las que @DatabaseView no se creaba de manera correcta.

Contribución externa

  • Se solucionó un problema en el modo JournalMode.TRUNCATE de Room en el que a veces la devolución de llamada InvalidationTracker no se invocaba o se hacía demasiado tarde o de manera inválida. Le agradecemos a Uli Bubenheimer | bubenheimer@users.noreply.github.com (b/154040286).

Versión 2.4.0-alpha01

21 de abril de 2021

Lanzamiento de androidx.room:room-*:2.4.0-alpha01. La versión 2.4.0-alpha01 contiene estas confirmaciones.

Nuevas funciones

  • Migraciones automáticas: Ahora, Room ofrece una API para generar migraciones automáticamente siempre que se exporten esquemas. Si deseas indicarle a Room que debe generar una migración automática, se puede usar una nueva propiedad @Database#autoMigrations para declarar las versiones desde y hasta las cuales se realizará la migración automática. Cuando Room necesita información adicional sobre el cambio de nombre o la eliminación de tablas y columnas, la anotación @AutoMigration puede declarar una clase de especificación que contiene esas entradas. Para obtener más detalles, consulta la documentación de @AutoMigration.

Correcciones de errores

  • Se corrigió un problema en el que la validación del esquema de Room validaba, de manera incorrecta, el elemento defaultValue con paréntesis adicionales (b/182284899).

Versión 2.3.0

Versión 2.3.0

21 de abril de 2021

Lanzamiento de androidx.room:room-*:2.3.0. La versión 2.3.0 contiene estas confirmaciones.

Cambios importantes desde la versión 2.2.0

  • Compatibilidad integrada de Enum: Ahora, Room usará, de forma predeterminada, el conversor de tipo Enum a String, y viceversa, si no se proporciona ninguno. Si ya existe un conversor de tipo para una enum, Room priorizará su uso en lugar del valor predeterminado.
  • Devolución de llamada de consulta: Ahora Room ofrece una API de callback general de RoomDatabase.QueryCallback, para cuando las consultas están por ejecutarse, lo que puede ser útil si deseas registrar compilaciones de depuración. Se puede configurar la devolución de llamada con RoomDatabase.Builder#setQueryCallback().
  • Mejora en base de datos empaquetada previamente: Ahora, Room tiene API para crear una base de datos con una lectura de base de datos empaquetada previamente de un flujo de entrada. Esto permite casos como la compresión con gzip de la base de datos previamente empaquetada.
  • Convertidores de tipo proporcionados: Ahora, Room tiene API para proporcionar instancias de convertidores de tipo, de modo que la app pueda controlar su inicialización. Para marcar un convertidor de tipo que se enviará a Room, usa la nueva anotación @ProvidedTypeConverter.
  • Compatibilidad con RxJava3: Room ahora admite tipos de RxJava3. De manera similar al objeto RxJava2, puedes declarar métodos DAO que muestran tipos de datos Flowable, Single, Maybe y Completable. Además, hay un nuevo artefacto androidx.room:room-rxjava3 disponible para admitir el elemento RxJava3.
  • Compatibilidad con Paging 3.0: Ahora Room admitirá la generación de implementaciones para los métodos @Query con anotaciones que muestren el tipo de datos androidx.paging.PagingSource.

Versión 2.3.0-rc01

24 de marzo de 2021

Lanzamiento de androidx.room:room-*:2.3.0-rc01. La versión 2.3.0-rc01 contiene estas confirmaciones.

Correcciones de errores

  • Se solucionó un problema que impedía que se consumieran las consultas de flujo de corrutinas creadas por Room en un bloque withTransaction suspendido (I797bf).

Versión 2.3.0-beta03

10 de marzo de 2021

Lanzamiento de androidx.room:room-*:2.3.0-beta03. La versión 2.3.0-beta03 contiene estas confirmaciones.

Nuevas funciones

  • Se agregó compatibilidad de compilación incremental para KSP (I031c1, b/176453350).

Correcciones de errores

  • Se corrigió un error en el que la creación de PagingSource en el subproceso principal podía activar un ANR (I42b74, b/181221318).
  • Se corrigió la visibilidad de @ExperimentalRoomApi para que sea público en lugar de un paquete privado (b/181356119).

Contribución externa

  • Permite que Room acepte mostrar un tipo de datos POJO para un método DAO anotado @Query cuando también se anota con @SkipQueryVerification. Room hará lo posible por convertir el resultado de la consulta que se muestra en un tipo de datos POJO, de la misma manera que se hace para un método DAO anotado @RawQuery. Gracias a "Markus Riegel | hey@marcorei.com" (I45acb).

Versión 2.3.0-beta02

18 de febrero de 2021

Lanzamiento de androidx.room:room-*:2.3.0-beta02. La versión 2.3.0-beta02 contiene estas confirmaciones.

Nuevas funciones

  • Ahora, Room cuenta con compatibilidad experimental para el Procesamiento de Símbolos de Kotlin KSP.

    KSP reemplaza las KAPT para ejecutar procesadores de anotaciones de forma nativa en el compilador de Kotlin, lo que reduce significativamente los tiempos de compilación.

    Para usar Room con KSP, puedes aplicar el complemento de KSP de Gradle y reemplazar la configuración kapt en tu archivo de compilación por ksp. Por ejemplo, en lugar de kapt 'androidx.room:room-compiler:2.3.0-beta02', usa ksp 'androidx.room:room-compiler:2.3.0-beta02'. Consulta la documentación de KSP para obtener más detalles.

    Ten en cuenta que, como KSP es experimental, se recomienda seguir usando KAPT para el código de producción. La reducción de los tiempos de compilación solo es aplicable si no hay otros procesadores que usen KAPT. Consulta b/160322705 para ver los problemas conocidos.

Versión 2.3.0-beta01

27 de enero de 2021

Lanzamiento de androidx.room:room-*:2.3.0-beta01. La versión 2.3.0-beta01 contiene estas confirmaciones.

Nuevas funciones

  • Bases de datos con cierre automático: Room ahora puede cerrar bases de datos a las que no se accede después de un período determinado. Esta es una función experimental y se puede habilitar mediante una llamada a RoomDatabase.Builder#setAutoCloseTimeout(). Esta función resulta útil para apps que tienen varias bases de datos.

Correcciones de errores

  • Se solucionó un problema por el que los métodos Dao que contenían varios métodos @Update o @Delete y diferentes estrategias de conflicto generaban código con una sola estrategia, sin tener en cuenta la que estaba definida. (/I0b90d, b/176138543)

Versión 2.3.0-alpha04

16 de diciembre de 2020

Lanzamiento de androidx.room:room-*:2.3.0-alpha04. La versión 2.3.0-alpha04 contiene estas confirmaciones.

Nuevas funciones

  • Ahora Room ofrece una API de callback general RoomDatabase.QueryCallback, para cuando las consultas están por ejecutarse, lo que puede ser útil para acceder a compilaciones de depuración. Se puede configurar la devolución de llamada con RoomDatabase.Builder#setQueryCallback() (Iaa513, b/174478034, b/74877608).
  • Ahora, Room usará de forma predeterminada el conversor de tipo Enum a String, y viceversa, si no se proporciona ninguno. Si ya existe un conversor de tipo para una enum, Room priorizará su uso en lugar del valor predeterminado (b/73132006).

Problema conocido

  • Si ya existe un conversor de tipo unidireccional para la lectura, Room podría usar accidentalmente el conversor Enum a String, lo que podría no ser lo deseado. Este es un problema conocido y se puede solucionar si se lo convierte en un conversor bidireccional. Consulta b/175707691.

Correcciones de errores

  • Se solucionó un problema en el que Room inhabilitaba de manera incorrecta el procesamiento de anotaciones incrementales en versiones más recientes del JDK (b/171387388).
  • Se solucionó un problema en el que Room encontraba la clase generada cuando se usaban múltiples cargadores de clases. Gracias por la corrección, "Serendipity | 892449346@qq.com" (b/170141113).
  • Se solucionó un problema por el que Room generaba códigos incorrectos cuando un elemento @Dao de Kotlin tenía una clase base cuyos genéricos eran primitivos en la JVM (b/160258066).

Contribución externa

  • Ahora, Room usará el modo beginTransactionNonExclusive si el modo WAL está habilitado y el nivel de API es 16 o más. Gracias a "Ahmed I. Khalil | ahmedibrahimkhali@gmail.com" (b/126258791).

Versión 2.3.0-alpha03

14 de octubre de 2020

Lanzamiento de androidx.room:room-*:2.3.0-alpha03. La versión 2.3.0-alpha03 contiene estas confirmaciones.

Nuevas funciones

  • Ahora Room tiene APIs para proporcionar instancias de convertidores de tipo, de modo que la app pueda controlar su inicialización. Para marcar un convertidor de tipo que se enviará a Room, usa la nueva anotación @ProvidedTypeConverter. Gracias a "mzgreen yairobbe@gmail.com" (Ie4fa5, b/121067210).

  • Ahora Room tiene API para crear una base de datos mediante una lectura de base de datos empaquetada previamente de un flujo de entrada. Esto permite casos como la compresión con gzip de la base de datos previamente empaquetada. Gracias a "Ahmed El-Helw ahmedre@gmail.com" (3e6792, b/146911060).

Cambios en la API

  • Se agregó el objetivo faltante a la anotación @ForeignKey, lo que impide su uso fuera de la anotación @Entity (Iced1e).

  • El campo mCallbacks en RoomDatabase.java ahora está oculto (d576cb, b/76109329).

Correcciones de errores

  • Actualización de la documentación de TypeConverters para aclarar que TypeConverters solo se puede usar a fin de convertir columnas o campos, pero no filas (I07c56, b/77307836).

  • Actualización de DaoProcessor para corregir el error del compilador en Dao con un supertipo genérico con "primitivas" de Kotlin (Ice6bb, b/160258066).

  • Actualización de la documentación sobre agregar o quitar métodos de observador para aclarar subprocesos (Ifd1d9, b/153948821).

  • Se solucionó un problema en el que Room validaba de forma incorrecta las tablas de FTS que declaraban su columna rowid (d62ebc, b/145858914).

Contribuciones externas

  • Soluciona los problemas relacionados con el uso de mayúsculas y minúsculas de la configuración regional del turco (5746e3, b/68159494).

  • Reemplaza el objeto ConcurrentHashMap en RoomDatabase con Collections.synchronizedMap() para evitar problemas en Android Lollipop (d1cfc7, b/162431855).

  • Agrega una devolución de llamada onOpenPrepackagedDatabase cuando se copia una base de datos que se empaquetó previamente (I1ba74, b/148934423).

Versión 2.3.0-alpha02

22 de julio de 2020

Lanzamiento de androidx.room:room-*:2.3.0-alpha02. La versión 2.3.0-alpha02 contiene estas confirmaciones.

Nuevas funciones

  • Compatibilidad con RxJava3: Room ahora admite tipos de RxJava3. De manera similar al objeto RxJava2, puedes declarar métodos DAO que muestran tipos de datos Flowable, Single, Maybe y Completable. Además, hay un nuevo artefacto androidx.room:room-rxjava3 disponible para admitir el elemento RxJava3 (b/152427884).

Cambios en la API

  • Ahora se admite declarar un elemento @TypeConverter en la clase Object de Kotlin (b/151110764).
  • La opción para el procesamiento de anotaciones incrementales de Room ahora está ACTIVADA de forma predeterminada (b/112110217).

Versión 2.3.0-alpha01

10 de junio de 2020

Lanzamiento de androidx.room:room-*:2.3.0-alpha01. La versión 2.3.0-alpha01 contiene estas confirmaciones.

Nuevas funciones

  • Compatibilidad con Paging 3.0: Room ahora admitirá la generación de implementaciones para los métodos @Query con anotaciones que muestren el tipo de datos androidx.paging.PagingSource.

    @Dao
    interface UserDao {
      @Query("SELECT * FROM users ORDER BY id ASC")
      fun pagingSource(): PagingSource<Int, User>
    }
    

Cambios en la API

  • @RewriteQueriesToDropUnusedColumns es una anotación nueva y conveniente que hace que Room reescriba la proyección "*" en una consulta de modo que se quiten las columnas no utilizadas en el resultado.
  • La opción de procesador room.expandProjection ya no está disponible. Usa @RewriteQueriesToDropUnusedColumns como reemplazo para las consultas de optimización de Room con proyecciones "*". Ten en cuenta que @RewriteQueriesToDropUnusedColumns no reemplaza la solución al conflicto de columnas que ofrecía room.expandProjection con respecto a los tipos de datos que se muestran y que contenían campos @Embedded.

Correcciones de errores

  • Se corrigió un error por el que Room no detectaba correctamente la versión de JDK usada para habilitar la adopción incremental del procesador de anotaciones. Gracias a Blaz Solar (me@blaz.solar) (b/155215201)
  • Ahora Room incorpora su dependencia de ANTLR al procesador de anotaciones a fin de evitar conflictos de versiones con otros procesadores que también usan ANTLR (b/150106190).

Versión 2.2.6

Versión 2.2.6

16 de diciembre de 2020

Lanzamiento de androidx.room:room-*:2.2.6. La versión 2.2.6 contiene estas confirmaciones.

Correcciones de errores

  • Se solucionó un problema en el que Room inhabilitaba de manera incorrecta el procesamiento de anotaciones incrementales en versiones más recientes del JDK (b/171387388).

Versión 2.2.5

Versión 2.2.5

18 de marzo de 2020

Lanzamiento de androidx.room:room-*:2.2.5. La versión 2.2.5 contiene estas confirmaciones.

Correcciones de errores

  • Crea directBootAware de MultiInstanceInvalidationService. Gracias a "Mygod contact-git@mygod.be" (b/148240967)
  • Se corrigió un error que causaba una falla cuando se habilitaba la invalidación de varias instancias y la base de datos contenía una entidad FTS (b/148969394).
  • Se corrigió un error relacionado con la carga de las bibliotecas nativas de SQLite en el procesador de anotaciones de Room que causaba la falla del compilador debido a compilaciones paralelas (b/146217083).

Versión 2.2.4

Versión 2.2.4

19 de febrero de 2020

Lanzamiento de 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 y androidx.room:room-testing:2.2.4. La versión 2.2.4 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un error con la suspensión de transacciones en el que se interbloqueaban si la corrutina se cancelaba rápidamente antes de que comenzara la transacción (b/148181325).
  • Se corrigió un error con el uso incorrecto de @Generated cuando se realizaban compilaciones con JDK 9 (b/146538330).
  • Se corrigió un error por el que Room generaba código incorrecto cuando una interfaz DAO tenía una función concreta en Kotlin (b/146825845).

Versión 2.2.3

Versión 2.2.3

18 de diciembre de 2019

Lanzamiento de androidx.room:room-*:2.2.3. La versión 2.2.3 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un error en el que Room no podía validar una base de datos que no se había migrado y contenía un hash heredado con índices en su esquema (b/139306173).

Versión 2.2.2

Versión 2.2.2

20 de noviembre de 2019

Lanzamiento de androidx.room:room-*:2.2.2. La versión 2.2.2 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un error en el que la recopilación de una relación de uno a uno con más de 999 filas provocaba que Room mostrara elementos relacionados nulos (b/143105450).

Versión 2.2.1

Versión 2.2.1

23 de octubre de 2019

Lanzamiento de androidx.room:room-*:2.2.1. La versión 2.2.1 contiene estas confirmaciones.

Correcciones de errores

  • Se corrigió un error por el que Room advertía incorrectamente sobre CURSOR_MISMATCH con la opción de compilador expandProjection activada (b/140759491).
  • Se agregó un mecanismo de reintento para administrar la biblioteca nativa faltante que se utiliza para verificar consultas durante el tiempo de compilación.

Versión 2.2.0

Versión 2.2.0

9 de octubre de 2019

Lanzamiento de androidx.room:room-*:2.2.0. La versión 2.2.0 contiene estas confirmaciones.

Cambios importantes desde la versión 2.1.0

  • Base de datos preempaquetada: Hay dos nuevas APIs disponibles en RoomDatabase.Builder para crear una RoomDatabase si ya hay un archivo de base de datos propagado. createFromAsset() sirve cuando el archivo de la base de datos propagado previamente está en la carpeta de elementos del APK, mientras que createFromFile() sirve cuando el archivo está en una ubicación arbitraria. El uso de estas APIs cambia el comportamiento de las migraciones destructivas de manera que, durante una migración alternativa, Room intentará volver a copiar la base de datos prepropagada si está disponible. De no ser posible, como último recurso descartará todas las tablas y volverá a crearlas (b/62185732).
  • Valores predeterminados del esquema: @ColumnInfo ahora tiene una nueva propiedad defaultValue que se puede usar para especificar el valor predeterminado de una columna. Los valores predeterminados son parte de un esquema de base de datos y, si se los especifica, se validarán durante las migraciones (b/64088772).
  • Relaciones de varios a varios: @Relation ahora tiene una nueva propiedad associateBy, que toma una nueva anotación @Junction, que se usa para declarar una relación a través de una tabla de unión, también conocida como tabla asociativa (b/69201917).
  • Relaciones uno a uno: Se quitó la restricción en los campos POJO anotados con @Relation de tipo List o Set, lo que permite representar relaciones de valor único con eficacia (b/62905145).
  • Entidad de destino: Las anotaciones de DAO @Insert, @Update y @Delete ahora tienen una nueva propiedad targetEntity, que permite especificar la tabla de destino sobre la que tiene efecto el método DAO. Esto permite que los parámetros de esos métodos DAO sean POJO arbitrarios que se interpretarán como entidades parciales. En la práctica, esto permite inserciones, eliminaciones y actualizaciones parciales (b/127549506).
  • Flujo de corrutinas: Los métodos DAO @Query ahora pueden ser Flow<T> de tipo de datos que se muestra. El flujo que se muestre reemitirá un nuevo conjunto de valores si se invalidan las tablas de observación en la consulta. Declarar una función DAO con un tipo de datos que se muestra Channel<T> es un error. En cambio, Room te incentiva a usar Flow y, luego, utilizar las funciones cercanas para convertir el Flow en un Channel (b/130428884).
  • Procesador de anotaciones incrementales de Gradle: Room ahora es un procesador de anotaciones de aislamiento de Gradle, y la incrementabilidad se puede habilitar mediante la opción room.incremental del procesador. Para obtener más información, consulta Opciones del compilador de Room. Si encuentras algún problema, infórmanos. Planeamos habilitar la capacidad de aumento de forma predeterminada en una versión futura y estable. b/112110217
  • Expansión de proyecciones: Se agregó una nueva opción experimental de compilador room.expandProjection, que hace que Room reescriba una consulta con una proyección "*" para contener solo las columnas en el tipo de datos que se muestra POJO. Por ejemplo, para un método DAO con @Query("SELECT * FROM Song") que muestra un POJO llamado SongIdAndTitle con solo dos campos. Luego, Room reescribe la consulta a SELECT id, title FROM Song, de modo de obtener el conjunto mínimo de columnas para satisfacer el tipo de datos que se muestra. Básicamente, esto elimina la advertencia CURSOR_MISMATCH que se presenta cuando la consulta muestra columnas adicionales que no coinciden con ningún campo en el tipo de POJO que se muestra.

Versión 2.2.0-rc01

5 de septiembre de 2019

Lanzamiento de androidx.room:room:2.2.0-rc01. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

No hay cambios públicos desde Room 2.2.0-beta01.

Versión 2.2.0-beta01

22 de agosto de 2019

Lanzamiento de androidx.room:room-*:2.2.0-beta01. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Correcciones de errores

  • Se corrigió un error relacionado con una consulta de flujo de corrutina que dejaba de reemitir valores nuevos después de cierto tiempo (b/139175786).
  • Se corrigió un error por el que Room no aceptaba un código hash de esquema heredado al abrir una base de datos que no se había migrado desde Room 1.0, lo que provocaba una falla de tiempo de ejecución debido a un esquema no válido (b/139306173).

Versión 2.2.0-alpha02

7 de agosto de 2019

Lanzamiento de androidx.room:room-*:2.2.0-alpha02. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Nuevas funciones

  • Flujo de corrutinas: Los métodos DAO @Query ahora pueden ser Flow<T> de tipo de datos que se muestra. El flujo que se muestre reemitirá un nuevo conjunto de valores si se invalidan las tablas de observación en la consulta. Declarar una función DAO con un tipo de datos que se muestra Channel<T> es un error. En cambio, Room te incentiva a usar Flow y, luego, utilizar las funciones cercanas para convertir el Flow en un Channel (b/130428884).
  • Expansión de proyecciones: Se agregó una nueva opción experimental de compilador room.expandProjection, que hace que Room reescriba una consulta con una proyección "*" para contener solo las columnas en el tipo de datos que se muestra POJO. Por ejemplo, para un método DAO con @Query("SELECT * FROM Song") que muestra un POJO llamado SongIdAndTitle con solo dos campos. Luego, Room reescribe la consulta a SELECT id, title FROM Song, de modo de obtener el conjunto mínimo de columnas para satisfacer el tipo de datos que se muestra. Básicamente, esto elimina la advertencia CURSOR_MISMATCH que se presenta cuando la consulta muestra columnas adicionales que no coinciden con ningún campo en el tipo de POJO que se muestra.
  • onDestructiveMigrate es una nueva API de callback que se agrega a RoomDatabase.Callback para cuando Room migra una base de datos de manera destructiva (b/79962330).

Correcciones de errores

  • Se corrigió un error relacionado con Room por el que se generaba un código incorrecto usando un método set de campo cuando el campo estaba protegido (b/136194628).
  • Se corrigió un error que hacía que el InvalidationTracker arrojara una NPE en un segundo proceso cuando se habilitaba la invalidación de varias instancias y se cancelaba el servicio de invalidación (b/137454915).
  • Se corrigió un error por el cual Room no identificaba correctamente el tipo de datos que se muestra de una función de suspensión heredada con anotación @RawQuery (b/137878827).
  • Se actualizó el código generado para @Relation cuando la clave relacionada es de tipo BLOB a fin de usar un ByteBuffer que sea comparable (b/137881998).
  • Se corrigió un error por el que Room reclamaba la falta de métodos set en los POJO utilizados como parámetros de entidad parciales de @Insert, @Update, y @Delete (b/138664463).
  • Se corrigió un error por el que Room reclamaba la falta de métodos get y set para una columna ignorada a través de @Entity cuando se utilizaba la clase de entidad en algunos métodos DAO (b/138238182).
  • Se corrigió un error por el que Room no convertía correctamente los argumentos de vinculación con nombre en argumentos posicionales, lo que causaba una excepción de tiempo de ejecución cuando se ejecutaba una consulta con parámetros reutilizados (b/137254857).

Versión 2.2.0-alpha01

10 de julio de 2019

Nuevas funciones

  • Base de datos preempaquetada: Hay dos nuevas APIs disponibles en RoomDatabase.Builder para crear una RoomDatabase si ya hay un archivo de base de datos propagado. createFromAsset() sirve cuando el archivo de la base de datos propagado previamente está en la carpeta de elementos del APK, mientras que createFromFile() sirve cuando el archivo está en una ubicación arbitraria. El uso de estas APIs cambia el comportamiento de las migraciones destructivas de manera que, durante una migración alternativa, Room intentará volver a copiar la base de datos prepropagada si está disponible. De no ser posible, como último recurso descartará todas las tablas y volverá a crearlas (b/62185732).
  • Valores predeterminados del esquema: @ColumnInfo ahora tiene una nueva propiedad defaultValue que se puede usar para especificar el valor predeterminado de una columna. Los valores predeterminados son parte de un esquema de base de datos y, si se los especifica, se validarán durante las migraciones (b/64088772).

    Nota: Si el esquema de tu base de datos ya tiene valores predeterminados, como los que se agregaron mediante ALTER TABLE x ADD COLUMN y INTEGER NOTNULL DEFAULT z, y decides definir los valores predeterminados a través de @ColumnInfo en las mismas columnas, es posible que debas proporcionar una migración para validar los valores predeterminados no contabilizados. Para obtener más información, consulta Migraciones de Room.

  • Relaciones de varios a varios: @Relation ahora tiene una nueva propiedad associateBy, que toma una nueva anotación @Junction, que se usa para declarar una relación a través de una tabla de unión, también conocida como tabla asociativa (b/69201917).
  • Relaciones uno a uno: Se quitó la restricción en los campos POJO anotados con @Relation de tipo List o Set, lo que permite representar relaciones de valor único con eficacia (b/62905145).
  • Entidad de destino: Las anotaciones de DAO @Insert, @Update y @Delete ahora tienen una nueva propiedad targetEntity, que permite especificar la tabla de destino sobre la que tiene efecto el método DAO. Esto permite que los parámetros de esos métodos DAO sean POJO arbitrarios que se interpretarán como entidades parciales. En la práctica, esto permite inserciones, eliminaciones y actualizaciones parciales (b/127549506).
  • Procesador de anotaciones incrementales de Gradle: Room ahora es un procesador de anotaciones de aislamiento de Gradle, y la incrementabilidad se puede habilitar mediante la opción room.incremental del procesador. Para obtener más información, consulta Opciones del compilador de Room. Si encuentras algún problema, infórmanos. Planeamos habilitar la capacidad de aumento de forma predeterminada en una versión futura y estable. b/112110217

Correcciones de errores

  • Room ya no propagará la EmptySetResultException al controlador de errores global cuando se haya eliminado la transmisión Rx antes de que se complete la consulta (b/130257475).
  • Se corrigió un error por el que Room mostraba un mensaje de error incorrecto cuando una función de DAO de suspensión anotada con @RawQuery no tenía un tipo de datos que se muestra (b/134303897).
  • Room ya no generará adaptadores DAO con tipos sin procesar (b/135747255).

Versión 2.1.0

Versión 2.1.0

13 junio de 2019

Lanzamiento de Room 2.1.0 sin modificaciones desde 2.1.0-rc01. Para conocer las confirmaciones incluidas en la versión, consulta este artículo.

Cambios importantes desde la versión 2.0.0

  • FTS: Ahora Room admite entidades con una tabla de asignación FTS3 o FTS4. Ahora las clases con anotaciones @Entity también pueden tener anotaciones @Fts3 o @Fts4 a fin de declarar una clase con una tabla de asignación de búsqueda de texto completo. Para lograr una mayor personalización, hay opciones de FTS disponibles a través de los métodos de anotación.
  • Vistas: Ahora Room permite declarar una clase como una consulta almacenada, también conocida como vista, mediante la anotación @DatabaseView.
  • Corrutinas: Ahora los métodos DAO pueden ser funciones de suspensión. Incluye room-ktx en tus dependencias para aprovechar esta función. El artefacto ktx también proporciona la función de extensión RoomDatabase.withTransaction para realizar transacciones de bases de datos dentro de una corrutina.
  • Valor automático: Ahora Room permite declarar clases con anotaciones AutoValue como entidades y POJO. Ahora puedes declarar las anotaciones @PrimaryKey, @ColumnInfo, @Embedded y @Relation de Room en métodos abstractos de la clase con anotaciones de valor. Ten en cuenta que estas anotaciones también deben ir acompañadas de @CopyAnnotations para que Room pueda comprenderlas correctamente.
  • Compatibilidad con datos asíncronos adicionales: Los métodos DAO con anotaciones @Insert, @Delete o @Update, junto con @Query que contengan instrucciones INSERT, DELETE o UPDATE, ahora admiten mostrar los tipos de datos Rx Completable, Single, Maybe, y el tipo de datos ListenableFuture de Guava, y pueden ser funciones de suspensión.
  • enableMultiInstanceInvalidation es una API nueva en RoomDatabase.Builder que sirve para habilitar la invalidación en varias instancias de RoomDatabase con el mismo archivo de base de datos.
  • fallbackToDestructiveMigrationOnDowngrade es una API nueva en RoomDatabase.Builder que sirve para recrear automáticamente la base de datos si se cambia a una versión inferior.
  • ignoredColumns es una API nueva en la anotación @Entity que se puede usar para crear una lista de campos ignorados según su nombre.
  • Room usará correctamente el constructor primario de Kotlin en las clases de datos, lo que evitará la necesidad de declarar las propiedades como vars.

Versión 2.1.0-rc01

29 de mayo de 2019

Correcciones de errores

  • Se corrigió un error de inicialización de Room que podía ocurrir debido a una configuración de temp_store ya establecida (b/132602198).
  • Se corrigió una advertencia de uso de comillas dobles para usuarios con SQLite 3.27.0 y versiones posteriores (b/131712640).
  • Se corrigió un error en el que InvalidationTracker causaba una falla cuando se producían varias verificaciones de invalidación en paralelo (b/133457594).

Versión 2.1.0-beta01

7 de mayo de 2019

Lanzamiento de androidx.room 2.1.0-beta01 sin modificaciones desde 2.1.0-alpha07. Para conocer las confirmaciones incluidas en esta versión, consulta este vínculo.

Versión 2.1.0-alpha07

25 de abril de 2019

Cambios de comportamiento/API

  • Se modificó la función de extensión RoomDatabase.withTransaction de modo que ya no tome un bloqueo de funciones con un CoroutineScope como receptor. De esta manera, se evita omitir el wrapper coroutineScope { } adicional necesario para ejecutar las acciones en el bloqueo de transacciones de manera simultánea.

Correcciones de errores

  • Se corrigió un error por el que Room no podía encontrar una coincidencia con un TypeConverter para una función de DAO de Kotlin que contenía un parámetro de tipo Collection (b/122066791).

Versión 2.1.0-alpha06

22 de marzo de 2019

Cambios de comportamiento/API

  • Ahora se serializan las consultas de transacciones asíncronas, de modo que Room no usará más de un subproceso para ejecutar transacciones de la base de datos. Se agregó RoomDatabase.Builder.setTransactionExecutor(Executor) para permitir la configuración del ejecutor que se debe utilizar en las transacciones.
  • RoomDatabase.runInTransaction(Callable) ya no unirá las excepciones marcadas en RuntimeExceptions (b/128623748).

Correcciones de errores

  • Se corrigió un error en el que el seguimiento de invalidaciones dejaba de observar una tabla de contenido si se agregaban observadores tanto para la tabla de contenido como para una tabla FTS de contenido externo (b/128508917).
  • Se actualizó la gramática de SQLite de Room para que coincida con SQLite 3.24.0 (b/110883668).

Versión 2.1.0-alpha05

13 de marzo de 2019

Nuevas funciones

  • La función de extensión RoomDatabase.withTransaction te permite realizar transacciones de bases de datos de forma segura dentro de una corrutina. Las funciones de extensiones de Room, junto con la compatibilidad con corrutinas, están disponibles en el artefacto room-ktx.
  • Los métodos DAO no abstractos con anotaciones @Transaction ahora pueden ser funciones de suspensión (b/120241587).

Cambios de comportamiento/API

  • Se cambió el nombre del artefacto room-coroutines por room-ktx para seguir la misma nomenclatura que otros artefactos androidx.
  • Los objetos beginTransaction, setTransactionSuccessful y endTransaction en RoomDatabase dejaron de estar disponibles, y se los reemplazó por runInTransaction y la función de extensión room-ktx withTransaction.

Correcciones de errores

  • Se corrigió un error por el que se soltaban los argumentos del tokenizador si el que se usaba era SIMPLE. b/125427014
  • Se corrigió un error por el que Room no identificaba correctamente las funciones de suspensión con parámetros cuyo tipo era una clase interna (b/123767877).
  • Se corrigió un error por el que el método @Query diferido de DAO con instrucciones INSERT, UPDATE o DELETE preparaba con anticipación la consulta en el subproceso principal (b/123695593).
  • Se corrigieron varios errores por los que Room generaba códigos incorrectos para algunas funciones de suspensión. b/123466702 y b/123457323
  • Se corrigió un error por el que no se suprimía correctamente el uso obsoleto de los métodos en el código generado. b/117602586
  • Se actualizó la dependencia de Room de androidx.sqlite a 1.0.2, que contiene correcciones a fin de controlar de forma correcta las bases de datos dañadas. b/124476912

Errores conocidos

  • Room 2.1.0-alpha05 depende del artefacto kotlinx-metadata-jvm que no está disponible actualmente en Maven Central (KT-27991). Puedes resolver esta dependencia si agregas maven { url "https://kotlin.bintray.com/kotlinx/" } a los repositorios de tu proyecto.

Versión 2.1.0-alpha04

25 de enero de 2019

Nuevas funciones

  • Los métodos DAO con anotaciones @Query que contienen instrucciones INSERT, UPDATE o DELETE ahora pueden mostrar tipos asíncronos Single, Mayble, Completable y ListenableFuture. Además, también pueden ser funciones de suspensión. b/120227284

Cambios de comportamiento/API

  • Room ahora mostrará un error si un método DAO no abstracto con anotaciones @Transaction muestra un tipo asíncrono como Single, Mayble, Completable, LiveData o ListenableFuture. Dado que las transacciones están confinadas en subprocesos, por el momento, es imposible que Room comience y finalice una transacción en torno a una función que puede realizar consultas en diferentes subprocesos (b/120109336).
  • OnConflictStrategy.FAIL y OnConflictStrategy.ROLLBACK ahora son @Deprecated, ya que no se comportan según lo esperado con las vinculaciones actuales SQLite de Android (b/117266738).

Correcciones de errores

  • Se corrigió un error por el que Room no usaba correctamente el TypeConverter de un tipo de resultado si el método DAO era una función de suspensión. b/122988159
  • Se corrigió un error por el que Room identificaba de manera incorrecta las funciones de suspensión heredadas como de no suspensión (b/122902595).
  • Se corrigió un error por el que Room generaba códigos incorrectos cuando un campo @Embedded estaba en una clase superior y se usaba en varias clases secundarias (b/121099048).
  • Se solucionó un problema por el que se bloqueaba la base de datos al invocar funciones de suspensión de DAO entre beginTransaction() y endTransaction() (b/120854786).

Versión 2.1.0-alpha03

4 de diciembre de 2018

Cambios en la API

  • Ahora el FTS tokenizer en @Fts3/@Fts4 lleva una cadena en lugar de una enumeración. Esto permite que Room use tokenizadores personalizados. Los asignadores de tokens integrados todavía están definidos en FtsOptions como constantes de cadena (b/119234881).

Nuevas funciones

  • Corrutinas: Ahora los métodos DAO pueden ser funciones de suspensión. Para admitir las funciones de suspensión en Room, se lanzó un nuevo artefacto, room-coroutines. b/69474692
  • Los métodos DAO con anotaciones @Insert, @Delete o @Update ahora admiten ListenableFuture como tipo de datos que se muestra. b/119418331

Correcciones de errores

  • Se solucionó un error por el que Room intentaba incorrectamente encontrar un constructor con columnas en la propiedad ignoredColumns de @Entity (b/119830714).
  • Se solucionó un error por el que Room no identificaba parámetros del método DAO como finales en su implementación generada (b/118015483).
  • Se solucionó un error en el que el procesador de Room fallaba al informar un error en una consulta con símbolos especiales. b/119520136
  • Se corrigió un error por el que Room rechazaba varias implementaciones de Collection como argumentos de una expresión IN. b/119884035
  • Se corrigió un error en el que los LiveData mostrados por Room recibían elementos no utilizados recopilados cuando se observaban de manera indefinida, lo que ocasionaba que ya no emitieran datos nuevos. b/74477406
  • Se actualizó el bloqueo de cierre de RoomDatabase a fin de reducir la contención de bloqueo (b/117900450).

Versión 2.1.0-alpha02

30 de octubre de 2018

Nuevas funciones

  • Se agregó compatibilidad para hacer referencia a @DatabaseView en @Relation. b/117680932

Correcciones de errores

  • Se corrigió un error por el que Room realizaba operaciones de E/S en el disco en el subproceso principal al suscribirse y desechar un tipo de datos que se muestra Rx (b/117201279).
  • Se corrigió un error en el que Room no encontraba un convertidor de tipo apropiado para un campo en una clase de entidad de Kotlin. b/111404868
  • Se corrigió un error en el que Room generaba un código incorrecto para una implementación de interfaz DAO que incluye un método predeterminado de Kotlin sin argumentos. b/117527454
  • Se actualizó el analizador de gramática de SQLite de Room y se corrigió un problema de rendimiento que prolongaba los tiempos de compilación (b/117401230).

Versión 2.1.0-alpha01

8 de octubre de 2018

Nuevas funciones

  • FTS: Ahora Room admite entidades con una tabla de asignación FTS3 o FTS4. Ahora las clases con anotaciones @Entity también pueden tener anotaciones @Fts3 o @Fts4 a fin de declarar una clase con una tabla de mapeo de búsqueda en el texto completo. Las opciones de FTS para mayor personalización están disponibles mediante los métodos de la anotación. b/62356416
  • Vistas: Ahora Room permite declarar una clase como una consulta almacenada, también conocida como vista, mediante la anotación @DatabaseView (b/67033276).
  • Valor automático: Ahora Room permite declarar clases con anotaciones AutoValue como entidades y POJO. Ahora puedes declarar las anotaciones @PrimaryKey, @ColumnInfo, @Embedded y @Relation de Room en métodos abstractos de la clase con anotaciones de valor. Ten en cuenta que estas anotaciones deben estar acompañadas de @CopyAnnotations para que Room pueda entenderlas correctamente. b/62408420
  • Compatibilidad adicional con tipos de datos que se muestran Rx: Los métodos DAO con anotaciones @Insert, @Delete o @Update ahora admiten mostrar los tipos de datos Rx Completable, Single<T> y Maybe<T>. b/63317956
  • Tipos con @Relation que no cambian: Antes, Room requería que los campos con anotaciones @Relation pudieran configurarse, pero ahora pueden ser parámetros de constructor.
  • enableMultiInstanceInvalidation: Es una API nueva en RoomDatabase.Builder que sirve para habilitar la invalidación en varias instancias de RoomDatabase con el mismo archivo de base de datos. Este mecanismo de invalidación de varias instancias también funciona con distintos procesos. b/62334005
  • fallbackToDestructiveMigrationOnDowngrade: Es una API nueva en RoomDatabase.Builder que sirve para recrear automáticamente la base de datos si se cambia a una versión inferior. b/110416954
  • ignoredColumns: Es una API nueva en la anotación @Entity que se puede usar para crear una lista de campos ignorados según su nombre. Sirve para ignorar campos heredados en una entidad (b/63522075).

Cambios de comportamiento/API

  • Ahora mCallback y mDatabase en RoomDatabase son @Deprecated y se quitarán en la próxima versión de Room. b/76109329

Correcciones de errores

  • Se corrigieron dos errores en los que Room no se recuperaba correctamente de una base de datos dañada o una migración incorrecta durante la inicialización. b/111504749 y b/111519144
  • Ahora Room usará de forma correcta el constructor principal de Kotlin en clases de datos, lo que evita la necesidad de declarar los campos como vars (b/105769985).

Versión 2.0.0

Versión 2.0.0

1 de octubre de 2018

Lanzamiento de androidx.room 2.0.0 sin cambios desde la versión 2.0.0-rc01.

Versión 2.0.0-rc01

20 de septiembre de 2018

Lanzamiento de androidx.room 2.0.0-rc01 sin modificaciones desde la versión 2.0.0-beta01.

Versión 2.0.0-beta01

2 de julio de 2018

Cambios de comportamiento/API

  • Se agregó RoomDatabase.Builder.setQueryExecutor() para permitir personalizar dónde se ejecutan las consultas.
  • Se agregó compatibilidad con RxJava2 Observable.
  • Ahora las implementaciones generadas de DAO y Database son definitivas.

Correcciones de errores

  • Especifica el nombre de clase/campo en el error "no se puede encontrar un captador para el campo". b/73334503
  • Se corrigió la compatibilidad de versiones anteriores de RoomOpenHelper con versiones anteriores de Room. b/110197391

Dependencias anteriores a AndroidX

Para las versiones de Room anteriores a AndroidX, incluye estas dependencias:

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"
}

Versión 1.1.1

Versión 1.1.1

19 de junio de 2018

Room 1.1.1 es idéntico a Room 1.1.1-rc1.

Versión 1.1.1-rc1

16 de mayo de 2018 Recomendamos utilizar Room 1.1.1-rc1 en lugar de 1.1.0 si usas migraciones.

Se solucionó un error por el que Room no administraba correctamente la inicialización posterior a la migración (b/79362399).

Versión 1.1.0

Versión 1.1.0-beta3

19 de abril de 2018

Correcciones de errores

  • Se corrigió un error de compilación que ocurría cuando un POJO de Kotlin hacía referencia a una entidad de relación que se había definido en Java (b/78199923).

Versión 1.1.0-beta2

5 de abril de 2018

Correcciones de errores

  • Se corrigió un error crítico en las implementaciones Single y Maybe de Rx de Room, en el que se reciclaba la consulta antes de tiempo, lo que ocasionaba problemas si agregabas más de un observador a las instancias de Single o Maybe que se habían mostrado (b/76031240).

  • [RoomDatabase.ImageAllTables][ref-clearAllTables] no ejecutará VACUUM en la base de datos si se invoca dentro de una transacción (b/77235565).

Versión 1.1.0-beta1

21 de marzo de 2018

Cambios en la API

  • En función de los comentarios de revisión de la API, @RawQuery ya no acepta que se pase una String como parámetro de consulta. Debes usar [SupportSQLiteQuery][ref-SupportSQLiteQuery]. (Consulta [SimpleSQLiteQuery][ref-SimpleSQLiteQuery] para crear fácilmente una instancia de [SupportSQLiteQuery][ref-SupportSQLiteQuery] con compatibilidad con argumentos).
  • El método [fallbackToDestructiveMigrationFrom][ref-fallbackToDestructiveMigrationFrom] de RoomDatabase.Builder ahora acepta vararg int en lugar de vararg Integer.

Correcciones de errores

  • Ahora [RoomDatabase.clearAllTables][ref-clearAllTables] intenta mostrar espacio al sistema operativo al configurar un punto de control de WAL y realizar un VACUUM de la base de datos.
  • Ahora [@RawQuery][ref-RawQuery] acepta cualquier POJO de la propiedad observedEntities, siempre y cuando tenga referencias a una o más entidades a través de sus campos Embedded o Relations (b/74041772).
  • Paging: Ahora la implementación DataSource de Room administra correctamente dependencias con varias tablas (como relaciones y uniones). Anteriormente, fallaban al activar resultados nuevos o hacer una compilación. b/74128314

Versión 1.1.0-alpha1

22 de enero de 2018

Nuevas funciones

  • RawQuery: esta API nueva permite que los métodos @Dao reciban la instrucción SQL como un parámetro de consulta. b/62103290, b/71458963
  • fallBackToDestructiveMigrationsFrom: Esta API nueva en RoomDatabase.Builder permite controlar de manera más detallada desde qué versiones de esquema iniciales se permiten las migraciones destructivas (en comparación con fallbackToDestructiveMigration). b/64989640
  • Ahora Room solo es compatible con las APIs de Paging más recientes (alpha-4+), de manera que ya no admite LivePagedListProvider, que dejó de estar disponible. Para usar la nueva versión Alfa de Room, debes utilizar paginación de alpha-4 o versiones posteriores y cambiar de LivePagedListProvider a LivePagedListBuilder, si todavía no lo hiciste.

Correcciones de errores

  • Compatibilidad mejorada para tipos Kotlin Kapt. b/69164099
  • El orden de los campos ya no invalida el esquema (b/64290754).