Android Studio中SQLite建表仅生成1张而非预期2张是什么原因?
问题根因与解决方案
你的代码中分开两次调用execSQL()执行建表语句的写法本身符合规范,execSQL()不支持单条语句内执行多段SQL的说法是正确的,你没有合并语句的写法完全没有问题,问题出在SQLiteOpenHelper的运行机制和你写的onUpgrade逻辑缺陷上。
最常见触发原因
SQLiteOpenHelper的onCreate回调仅会在数据库文件第一次被创建时执行一次:
- 如果你之前运行过APP,已经生成了仅包含
users表的旧版Login.db文件,后续只要数据库版本号没有修改,系统会认为数据库已经初始化完成,不会再触发onCreate方法执行,新增的weightTable建表语句永远不会被执行。 - 你当前写的
onUpgrade方法仅执行了删表逻辑,没有调用onCreate重建表,就算升级版本号也不会自动生成新表。
修复步骤
- 先将模拟器/测试机上已安装的APP完全卸载,删除本地残留的旧数据库文件
- 修改
DBHelper构造方法中传入的数据库版本号,将原来的1改为更高的整数(例如2) - 补充
onUpgrade的逻辑,删除旧表后主动调用onCreate重建所有表,修改后的代码如下:
@Override public void onUpgrade(SQLiteDatabase myDB, int oldVersion, int newVersion) { myDB.execSQL("drop Table if exists users"); myDB.execSQL("drop Table if exists weightTable"); // 新增这行,删表后重新执行建表逻辑 onCreate(myDB); }
- 重新编译运行APP即可看到两张表都被正常创建。
排查验证方法
如果执行以上操作后问题依旧存在,可以在onCreate的两段建表语句前后加日志打印,确认代码是否执行到了weightTable的建表逻辑,同时捕获SQLException排查是否存在SQL语法拼写错误。
内容的提问来源于stack exchange,提问作者Anonymous User
相关产品推荐
相关产品推荐

