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

Android中复制SQLite数据库表遇问题:升级后新表未显示求助

问题分析与解决方案

你遇到的核心问题其实是事务未正确提交,导致创建products_copy表的操作被悄悄回滚了——这就是为什么日志显示迁移执行了,但实际在DB Browser里看不到新表的原因。

问题根源

你在代码里调用db.beginTransaction()开启了事务,但没有调用db.setTransactionSuccessful()来标记事务执行成功。SQLite的事务规则是:如果没有主动标记事务成功,当执行endTransaction()时,系统会自动回滚整个事务内的所有操作,包括你创建复制表的CREATE TABLE AS SELECT语句。所以日志虽然打印了,但实际的建表操作被撤销了。

修正后的升级代码

把你的onUpgrade方法改成这样即可解决问题:

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    if (oldVersion < 2) {
        db.beginTransaction();
        try {
            // 去掉表名的单引号,SQLite普通表名不需要额外包裹
            db.execSQL("create table products_copy as select * from products;");
            Log.d(getClass().getName(), "Migrating to version 2.");
            // 关键步骤:标记事务执行成功,确保endTransaction时提交操作
            db.setTransactionSuccessful();
        } finally {
            // 无论try块是否抛出异常,都要结束事务,避免资源泄漏
            db.endTransaction();
        }
    }
}

额外排查点

如果修正后还是看不到新表,可以检查这几个细节:

  • 确认从Device File Explorer复制的是正确的数据库文件:有些App可能在不同目录下存在多个数据库文件,或是你复制了缓存的旧文件
  • 验证数据库版本确实完成升级:可以在数据库打开时打印当前版本号,确认oldVersion确实是1,newVersion成功升级到2
  • 检查SQL语句是否有语法问题:虽然你的语句本身没问题,但可以尝试在DB Browser里直接执行这条SQL,确认能正常创建表

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:56