Android Room notNull 字段需要空默认值

Android Room notNull field is expecting a null default value

我正在尝试向我的表格添加新属性,如下所示:


@Entity(
    tableName = "invoices", indices = [Index(value = [...], unique = true)]
)
data class Invoice(
    ...
    override val created_at: Long = 0,
    override var approved_at: Long? = 0,
) : ICD

所以我创建了以下迁移:

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

但每当我尝试 运行 时,它都会说迁移处理不当,并按预期显示:

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'}}, ... }

这是发现了什么:

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'}}, ... }
        

谁能告诉我为什么它需要默认值 null?

我认为,您使用的 Room 版本高于 2.2.0,版本 2.2.0 及更高版本需要在各自的实体 class 中定义列的默认值使用 @ColumnInfo(defaultValue="0")

根据您的情况,将 @ColumnInfo(defaultValue="0") 添加到 created_atapproved_at

@ColumnInfo(defaultValue="0")
override val created_at: Long = 0,
@ColumnInfo(defaultValue="0")
override var approved_at: Long? = 0,

并将您的迁移功能更改为此

database.execSQL("ALTER TABLE invoices ADD COLUMN created_at INTEGER NOT NULL DEFAULT 0")
database.execSQL("ALTER TABLE invoices ADD COLUMN approved_at INTEGER")

如果您使用的是 Room 版本 2.4.0-alpha01 及更高版本,您可以使用 autoMigration

对于 autoMigration,将 autoMigrations 注释添加到您的数据库

@Database(
    entities = [.., .., ..],
    version = 2,
    autoMigrations = [AutoMigration(from = 1, to = 2)]
)
abastract class Database: RoomDatabase