You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:45:04