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

SQLite onUpgrade()添加列失败问题求助

解决SQLite数据库onUpgrade()未生效、新增列缺失的问题

看起来你在升级SQLite数据库到版本2时遇到了头疼的问题——onUpgrade()没触发,导致新增的signature列不存在,执行UPDATE语句时直接报错。我来帮你梳理几个最可能的原因和解决办法:

1. 先确认数据库版本号真的改了

这是最容易忽略的点!你必须把companion object里的DATABASE_VERSION从原来的1改成2,系统才会认为需要执行升级逻辑。如果版本号没变动,onUpgrade()根本不会被调用,自然加不上新列。

2. 检查onUpgrade()的实现是否正确

你需要在onUpgrade()里明确执行添加列的SQL语句,而且要做好版本判断(方便后续更高版本的升级)。比如正确的实现应该是这样:

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    // 针对从版本1升级到版本2的情况
    if (oldVersion < 2) {
        // 给invoices表添加signature列,注意SQL语句的正确性
        db.execSQL("ALTER TABLE invoices ADD COLUMN signature TEXT")
    }
}

一定要确保SQL语句没有拼写错误,比如列名signature、类型TEXT都要和你后续UPDATE语句里的一致。

3. 同步onCreate()里的表结构

如果用户是全新安装你的APP(不是覆盖旧版本),系统会调用onCreate()而不是onUpgrade()。这时候要保证onCreate()里创建的invoices表已经包含signature列,或者让onCreate()复用onUpgrade()的逻辑,避免新旧安装的数据库结构不一致:

override fun onCreate(db: SQLiteDatabase) {
    // 方式1:直接创建包含所有列的表(适合版本2的初始创建)
    db.execSQL("CREATE TABLE invoices (id INTEGER PRIMARY KEY, [其他原有列], signature TEXT)")
    
    // 方式2:调用onUpgrade来同步结构,更易维护
    // onUpgrade(db, 0, DATABASE_VERSION)
}

4. 测试时的小坑要避开

  • 如果你之前在模拟器/真机上装过旧版本,必须覆盖安装才能触发onUpgrade();如果是卸载后重装,系统会走onCreate(),这时候要验证新的表结构是否正确。
  • 可以用adb命令直接查看数据库结构,确认signature列是否存在:
    adb shell
    sqlite3 /data/data/你的应用包名/databases/你的数据库名
    PRAGMA table_info(invoices);
    
    执行后会列出invoices表的所有列,一眼就能看到signature有没有被加上。

5. 清理缓存或重置测试环境

有时候模拟器的缓存会导致数据库没有更新,你可以尝试清除APP的数据(设置→应用→你的APP→存储→清除数据),或者卸载后重新安装测试版本升级流程。

内容的提问来源于stack exchange,提问作者user9172697

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:42:51