Android Room迁移默认值异常:预期0却返回1的问题求助
问题原因及解决方案
核心原因:SQLite的主键特殊行为
你遇到的问题是SQLite内置规则导致的,和Room无关:当主键列定义为INTEGER NOT NULL类型时,哪怕没显式声明AUTOINCREMENT,SQLite会自动将其视为自增主键。此时用INSERT INTO FirstLoad DEFAULT VALUES插入时,SQLite会忽略你设置的DEFAULT 0,自动分配从1开始的自增整数作为主键值。
验证逻辑
你手动指定值插入时正常,是因为显式赋值会跳过SQLite的自增主键自动分配逻辑——只有当不指定该列值(或用DEFAULT VALUES)时,才会触发这个行为。
解决方案(二选一即可)
方案1:修改建表语句,规避自增主键触发规则
把主键列的类型从INTEGER改为INT(SQLite对INT的处理不会触发自增主键规则),迁移代码修改如下:
val migration5To6 = object: Migration(5,6){ override fun migrate(database: SupportSQLiteDatabase) { database.execSQL( "CREATE TABLE IF NOT EXISTS FirstLoad (isFirstCreated INT NOT NULL PRIMARY KEY DEFAULT 0)" ) } }
方案2:修改插入语句,显式指定默认值
放弃使用DEFAULT VALUES,改为显式插入0:
db.execSQL("INSERT INTO FirstLoad (isFirstCreated) VALUES (0)")
额外说明
如果确实需要INTEGER类型的主键且保留默认值0,只能通过显式插入的方式实现——因为SQLite的自增主键规则优先级高于自定义默认值。
内容的提问来源于stack exchange,提问作者Евгений s
相关产品推荐
相关产品推荐

