Sqflite创建两张表仅user_profile可用,user_transactions不存在如何解决
问题根因
sqflite的execute方法默认仅支持单条SQL语句执行,你将两条建表语句用分号拼接后传入同一次execute调用时,方法只会执行第一条CREATE TABLE user_profile语句,第二条建表语句会被直接丢弃,因此只会生成第一张表,访问第二张表时就会抛出不存在的错误。
你在DB Browser for SQLite中可以正常执行是因为桌面端SQLite管理工具默认支持多语句批量执行,和sqflite的默认运行逻辑不同。
解决方案
- 拆分建表语句,分开调用
execute执行,修改后的数据库初始化代码如下:
import 'package:sqflite/sqflite.dart' as sql; import 'package:path/path.dart' as path; import 'package:sqflite/sqlite_api.dart'; class DBHelper { static Future<Database> database() async { final dbPath = await sql.getDatabasesPath(); return sql.openDatabase(path.join(dbPath, 'users.db'), onCreate: (db, version) async { // 执行第一张表建表语句 await db.execute( 'CREATE TABLE user_profile(id TEXT PRIMARY KEY, name TEXT, address TEXT,mobileno TEXT,dob TEXT)' ); // 执行第二张表建表语句 await db.execute( 'CREATE TABLE user_transactions(id TEXT PRIMARY KEY, date TEXT, amount TEXT,cart TEXT)' ); }, version: 2); // 升级版本号触发onCreate重新执行 } }
- 若你不需要兼容旧版本用户,直接将数据库版本号从1修改为2即可触发数据库重建;如果需要兼容旧版本,需要额外添加
onUpgrade回调处理表结构更新逻辑。 - 若不想修改版本号,可手动进入设备的应用设置页,找到对应应用清除全部存储数据后再启动应用,比单纯卸载重装更可靠,避免系统自动备份恢复旧数据库文件导致问题复现。
- 可选优化:如果需要批量执行多条SQL语句,可使用
batch方法减少调用开销:
onCreate: (db, version) async { final batch = db.batch(); batch.execute('CREATE TABLE user_profile(id TEXT PRIMARY KEY, name TEXT, address TEXT,mobileno TEXT,dob TEXT)'); batch.execute('CREATE TABLE user_transactions(id TEXT PRIMARY KEY, date TEXT, amount TEXT,cart TEXT)'); await batch.commit(); }
内容的提问来源于stack exchange,提问作者Archit Dandavate
相关产品推荐
相关产品推荐

