es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Android Room 2.3.0 ignora las anotaciones de columna de los campos heredados.

Con Room 2.2.6 era posible definir anotaciones de columna en una clase abstracta. Las clases de entidad podían extender la clase abstracta y heredar las declaraciones de columna. Esto permitía definir columnas comunes (por ejemplo, id) en un solo lugar y usarlas en muchos lugares.

Clase abstracta:

abstract class BaseUnit(
    @PrimaryKey @ColumnInfo(name = "id") override val id: String,
    @ColumnInfo(name = "boxId") override val boxId: String
)

Clase de entidad derivada que hereda la declaración de id y boxId:

@Entity(
    indices = [Index(BaseUnit.BOX_ID)],
    foreignKeys = [
        ForeignKey(
            entity = Box::class,
            parentColumns = arrayOf(Box.ID),
            childColumns = arrayOf(BaseUnit.BOX_ID),
            onDelete = ForeignKey.CASCADE
        )
    ]
)
data class LevelUnit(
    @Ignore override val id: String,
    @Ignore override val boxId: String,
    @ColumnInfo(name = LEVEL) var level: Int
) : BaseUnit(id, boxId) {

    companion object {
        const val LEVEL = "level"
    }

}

Después de actualizar a Room 2.3.0, el código anterior genera el siguiente error de compilación:

error: Las entidades y POJOs deben tener un constructor público utilizable. Puedes tener un constructor vacío o un constructor cuyos parámetros coincidan con los campos (por nombre y tipo).

Se probaron los siguientes constructores pero no coincidieron:
LevelUnit(java.lang.String,java.lang.String,int) -> [param:id -> matched field:unmatched, param:boxId -> matched field:unmatched, param:level -> matched field:level]

Observaciones adicionales:

  • En el archivo JSON generado del esquema, faltan las columnas id y boxId para la tabla LevelUnit.
  • También hay errores consecuentes relacionados con las claves foráneas y los índices, probablemente porque faltan id y boxId.
  • Si se elimina la anotación @Ignore de los campos heredados en la clase LevelUnit, se produce el siguiente error de compilación: error: Una entidad debe tener al menos 1 campo anotado con @PrimaryKey.
  • Room 2.4.0 muestra el mismo comportamiento.

A mí me parece que el procesamiento de anotaciones ha cambiado y que las anotaciones de la clase padre BaseUnit no se evalúan. ¿Alguien ha experimentado el mismo comportamiento o tiene alguna idea de cómo resolver el problema?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Parece que con la actualización a Room 2.3.0, se ha eliminado la capacidad de definir anotaciones de columnas en una clase abstracta. Esto significa que la clase de entidad derivada, LevelUnit, ahora debe definir las columnas id y boxId en lugar de heredarlas de la clase abstracta padre, BaseUnit.

    Este cambio resulta en errores de compilación porque la clase de entidad ya no tiene un constructor que coincida con los campos, y las claves externas e índices pueden no estar correctamente definidos.

    Es posible que este cambio haya sido intencional y parte de la actualización de Room, pero no está claro sin una investigación adicional. Puede ser necesario refactorizar el código para tener en cuenta este cambio en el procesamiento de anotaciones.

Comments are closed.