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
yboxId
para la tablaLevelUnit
. - También hay errores consecuentes relacionados con las claves foráneas y los índices, probablemente porque faltan
id
yboxId
. - Si se elimina la anotación
@Ignore
de los campos heredados en la claseLevelUnit
, 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?
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 columnasid
yboxId
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.