You need to enable JavaScript to run this app. Flutter使用sqflite创建SQLite表时触发SQL语法报错
优惠活动
大模型
产品
解决方案
定价
更多

Flutter使用sqflite创建SQLite表时触发SQL语法报错

报错核心成因

抛出的SqfliteDatabaseException直接指向account表的建表语句存在尾随逗号语法错误:在account表的字段定义末尾,最后一个字段type VARCHAR(64)后面多了一个冗余逗号,SQLite解析逻辑遇到这个逗号后,会期待后续的新字段定义,结果直接碰到表结构的右括号,直接触发代码为1的SQLITE_ERROR,和报错信息里定位的near ")": syntax error完全匹配。

解决方法
  • 删除account表建表语句里最后一个字段type后面的多余逗号,修正字段定义的语法
  • 若之前测试时已经生成过残留的空数据库文件,需要先卸载应用清除本地存储、删除残留的roznamcha.db文件,避免onCreate初始化回调因为数据库已存在而不再触发,导致修复不生效
  • 可选优化:transaction是SQL保留关键字,后续对该表做增删改查操作时容易触发解析错误,建议将表名改为非保留字(比如transactions)规避兼容问题

修正后的完整初始化代码如下:

Future<Database> openDb() async {
  if (db == null) {
    final pathdb = await getDatabasesPath();
    final path = join(pathdb, 'roznamcha.db');

    db = await openDatabase(
      path,
      onCreate: (Database database, int version) async {
        // 已删除type字段后的多余逗号
        await database.execute('''
CREATE TABLE account (
  accountNumber INTEGER PRIMARY KEY AUTOINCREMENT,
  name VARCHAR(64) NOT NULL,
  telphone VARCHAR(10) NOT NULL,
  address VARCHAR(100),
  issueDate DATETIME,
  balance INTEGER,
  image VARCHAR(255),
  type VARCHAR(64)
)''');

        // 表名调整为非保留字,规避关键字冲突
        await database.execute('''
CREATE TABLE transactions (
  transactionNumber INTEGER PRIMARY KEY AUTOINCREMENT,
  description TEXT NOT NULL,
  issueDate DATETIME NOT NULL,
  credit INTEGER,
  debit INTEGER,
  accountNum INTEGER,
  record BOOLEAN DEFAULT false,
  rate INTEGER NOT NULL
)''');
      },
      version: 1,
    );
  }
  return db;
}

内容的提问来源于stack exchange,提问作者maliha arash

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 20:27:03