Estoy tratando de agregar nuevos atributos a mis tablas como se muestra aquí:
@Entity( tableName = "invoices", indices = [Index(value = [...], unique = true)] ) data class Invoice( ... override val created_at: Long = 0, override var approved_at: Long? = 0, ) : ICDasí que creé la siguiente migración:
val MIGRATION_3_4 = object: Migration(3, 4) { override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("ALTER TABLE invoices ADD COLUMN created_at INTEGER NOT NULL DEFAULT 0") database.execSQL("ALTER TABLE invoices ADD COLUMN approved_at INTEGER DEFAULT 0 ") } }pero cada vez que intento ejecutarlo, dice que la migración no se manejó correctamente y muestra esto como se esperaba:
TableInfo{name='invoices', columns={... ,created_at=Column{name='created_at', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='null'}, approved_at=Column{name='approved_at', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='null'}}, ... }y esto como lo que se encuentra:
TableInfo{name='invoices', columns={... ,created_at=Column{name='created_at', type='INTEGER', affinity='3', notNull=true, primaryKeyPosition=0, defaultValue='0'}, approved_at=Column{name='approved_at', type='INTEGER', affinity='3', notNull=false, primaryKeyPosition=0, defaultValue='0'}}, ... }¿Alguien puede decirme por qué espera un valor predeterminado nulo, por favor?
Lo que creo es que está utilizando una versión de Room superior a 2.2.0 , y la versión 2.2.0 y superior necesita que los valores predeterminados de las columnas se definan en su clase de entidad respectiva usando @ColumnInfo(defaultValue="0")
Para su caso, agregue @ColumnInfo(defaultValue="0") a created_at y approved_at
@ColumnInfo(defaultValue="0") override val created_at: Long = 0, @ColumnInfo(defaultValue="0") override var approved_at: Long? = 0,Y cambie su función de migración a esta
database.execSQL("ALTER TABLE invoices ADD COLUMN created_at INTEGER NOT NULL DEFAULT 0") database.execSQL("ALTER TABLE invoices ADD COLUMN approved_at INTEGER") Si usa una versión de Room 2.4.0-alpha01 y superior, puede usar autoMigration .
Para autoMigration , agregue la anotación de autoMigrations a su base de datos
@Database( entities = [.., .., ..], version = 2, autoMigrations = [AutoMigration(from = 1, to = 2)] ) abastract class Database: RoomDatabase