【问题标题】:Android Room notNull field is expecting a null default valueAndroid Room notNull 字段需要一个空默认值
【发布时间】:2021-12-02 13:08:54
【问题描述】:

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


@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 吗?

【问题讨论】:

    标签: android sqlite kotlin android-room


    【解决方案1】:

    我相信,您使用的 Room 版本大于 2.2.0,而 2.2.0 及更高版本需要使用 @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")
    

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

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

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

    【讨论】:

    • 我试过这个,现在我得到以下错误“ android.database.sqlite.SQLiteException: Cannot add a NOT NULL column with default value NULL (code 1): , while compile: ALTER TABLE invoices ADD COLUMN created_at INTEGER NOT NULL "
    • 将默认 0 添加到迁移函数 sql 似乎已经解决了这个问题(使用您为实体提到的注释)
    • 我已根据您的建议更新了我的答案。
    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-27
    • 1970-01-01
    • 2012-08-04
    • 2021-06-22
    • 1970-01-01
    • 2014-07-25
    相关资源
    最近更新 更多