sqflite新增第二张User表失败 报no such table异常
问题根本原因
openDatabase的onCreate回调仅在数据库文件第一次被创建时触发一次。你之前启动应用时已经生成了版本号为1的数据库文件,当时的_createDatabase逻辑要么还没加入User表的建表语句,要么执行Question表建表后出现异常中断,导致User表从未被创建。后续你修改代码补充了User表建表逻辑,但因为本地已存在同名同版本的数据库文件,onCreate不会重复执行,所以一直缺User表。- 你修改数据库名后问题依旧,是因为没有完全卸载应用重装:sqflite的数据库文件持久化存储在设备应用沙盒中,热重载、热重启都不会删除已存在的库文件,只要库文件存在、版本号不变化,就不会触发建表/升级逻辑。
解决方法
- 开发调试阶段快速修复:完全卸载设备上当前安装的应用,重新全量编译运行。旧的数据库文件会被彻底清除,首次启动会完整执行
_createDatabase里的所有建表语句,即可正常创建两张表。注意不要用热重载/热重启操作,必须走完整卸载重装流程。 - 正式迭代场景的标准修复方案:升级数据库版本号,增加
onUpgrade回调补建缺失的表,适配已经安装过旧版本应用的用户,参考代码如下:
var database = await openDatabase( path, version: 2, // 版本号从原来的1修改为2 onCreate: _createDatabase, onUpgrade: (Database db, int oldVersion, int newVersion) async { // 旧版本小于2时,补建User表 if (oldVersion < 2) { String userTableName = UserModel.KEY_USER_TABLE_NAME; String userTableSql = """CREATE TABLE IF NOT EXISTS $userTableName (uid INTEGER PRIMARY KEY,name TEXT,email TEXT,password TEXT);"""; await db.execute(userTableSql); } }, );
- 额外校验项:确认
UserModel.KEY_USER_TABLE_NAME的常量值就是User,不存在拼写错误、多余不可见字符,避免建出表名和插入时引用的表名不匹配的问题。
内容的提问来源于stack exchange,提问作者Ashmit Singh
相关产品推荐
相关产品推荐

