You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 14:35:11