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
相关产品推荐
相关产品推荐

