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
相关产品推荐
相关产品推荐

