Flutter sqflite使用数组变量定义表字段时出现重复列错误的原因是什么
错误原因
Dart 的字符串插值规则要求:如果要插入的是表达式而非单个变量,必须用大括号包裹表达式内容。你直接写 $columns4Table[0] 时,Dart 只会把 columns4Table 整体作为变量插值,后面的 [0] 会被当做普通字符串拼接,不会读取列表下标对应的值。
从报错日志里的最终生成 SQL 也能验证:生成的建表语句中列名变成了 [_id, name, age][0]、_id, name, age 这类内容,SQL 解析时识别到多个字段声明里都包含 _id、name、age 字符串,就抛出了重复列的错误。
解决方法
方法1:修正字符串插值写法
给列表取值的表达式加上大括号,明确告诉 Dart 要解析整个表达式的值:
static final List<String> columns4Table = ['_id', 'name', 'age']; ... CREATE TABLE $table ( ${columns4Table[0]} INTEGER PRIMARY KEY, ${columns4Table[1]} TEXT NOT NULL, ${columns4Table[2]} INTEGER NOT NULL )
方法2:批量拼接建表语句(适合列数较多的场景)
如果后续需要维护的列较多,也可以直接遍历列表拼接建表语句,避免手动写下标出错:
final columnDeclarations = [ '${columns4Table[0]} INTEGER PRIMARY KEY', '${columns4Table[1]} TEXT NOT NULL', '${columns4Table[2]} INTEGER NOT NULL', ]; final createTableSql = 'CREATE TABLE $table (${columnDeclarations.join(', ')})';
修改完成后重新运行应用即可,因为之前的错误是代码生成的 SQL 语法问题,和原有应用缓存无关,不需要额外卸载重装也能生效。
内容的提问来源于stack exchange,提问作者puzzled
相关产品推荐
相关产品推荐

