Flutter sqflite查询提示表不存在但插入无报错问题咨询
核心错误点
你的建表逻辑存在两个问题,直接导致表没有被成功创建:
- SQL语法错误:建表语句中
id INTEGER PRIMARY KEY字段末尾缺失逗号,字符串拼接后实际生成的SQL语句为:
该语句存在语法错误,执行时会直接失败,CREATE TABLE entity (id INTEGER PRIMARY KEYtitulo VARCHAR,subtitulo VARCHAR)entity表从未被创建成功。 - 异步逻辑未等待:
onCreate回调中的db.execute()是异步操作,你没有添加await关键字,openDatabase不会等待建表操作执行完成就提前返回数据库实例,建表失败的异常也被直接吞掉,没有向外抛出。
插入无异常、查询报错的原因
这是异步操作错误未被捕获导致的错觉,不是插入操作真的执行成功:
- 你调用
save()方法时,插入操作会被加入数据库操作队列排队,此时建表操作正在异步执行且最终会失败,但你没有对save()返回的Future做错误捕获,插入操作的失败异常被静默丢弃,你看不到报错就误以为插入成功,实际上数据根本没有写入数据库。 - 当你调用
findAll()执行查询时,前面排队的建表操作已经报错结束,数据库中确实不存在entity表,查询操作直接触发了“表不存在”的异常,此时你才感知到错误。
修复步骤
- 修正建表SQL语法,补全缺失的逗号,同时给异步的建表操作加
await,确保建表完成后再使用数据库:Future<Database> createDatabase() { return getDatabasesPath().then((dbPath) { final String path = join(dbPath, "generic-app.db"); return openDatabase(path, onCreate: (db, version) async { // 补全id字段后的逗号,添加await等待建表执行完成 await db.execute("CREATE TABLE entity (" "id INTEGER PRIMARY KEY," "titulo VARCHAR," "subtitulo VARCHAR" ")"); }, version: 1); }); } - 修改完成后先卸载当前App再重新运行:因为之前第一次启动已经生成了空的数据库文件,
onCreate回调仅在数据库文件首次创建时触发,不卸载重装的话不会重新执行建表逻辑,依然会报表不存在错误。 - 建议给所有数据库操作添加错误捕获逻辑,避免静默失败的问题,例如调用
save()时可以增加错误处理:save(entity).then((insertId) { // 插入成功后的业务逻辑 }).catchError((err) { // 打印或处理插入错误,避免异常被吞 print("数据插入失败:$err"); });
内容的提问来源于stack exchange,提问作者Gustavo Junkes
相关产品推荐
相关产品推荐

