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

Flutter连接SQLite保存数据失败:PERSON表无salary列问题排查

问题修复方案

核心问题:PERSON表缺少salary字段

异常提示表无salary字段,根源是新安装应用执行onCreate时,PERSON表的创建语句未包含salary字段。虽然onUpgrade逻辑里添加了该字段,但仅在旧版本数据库升级时触发,新安装应用直接走onCreate,导致表结构缺失salary,最终插入失败。

修复步骤1:更新onCreate中的表创建语句

修改litedb.dart里的onCreate方法,给PERSON表补充salary字段:

onCreate: (Database db, int version) async {
  // 创建数据库表
  await db.execute(
      '''  
        CREATE TABLE PERSON (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, salary REAL NULL);
        CREATE TABLE ACCOUNT (id INTEGER PRIMARY KEY AUTOINCREMENT, PERSON_ID INTEGER NOT NULL, ACCOUNT INTEGER NOT NULL, VALUE REAL);
      '''
  );
  print('Text Database has been created');
},

这样新安装应用的表结构自带salary字段,旧版本升级用户通过onUpgrade补全字段,两种场景都能兼容。

次要问题:deletePerson方法调用错误

db_helper.dart里的deletePerson误用update方法执行删除SQL,需改成调用父类的delete方法:

deletePerson(Person person) async {
  String sql = '''
     DELETE FROM PERSON
     WHERE 
     id = ${person.id}
  ''';
  int result = await delete(sql); // 将update替换为delete
  return result;
}

优化建议:规避SQL注入风险

当前SQL语句直接拼接字符串,存在注入安全隐患,建议改用参数化查询:

// 优化insertNewPerson
insertNewPerson(Person person) async {
  String sql = '''
     INSERT INTO PERSON(name, age, salary)
     VALUES (?, ?, ?)
  ''';
  int result = await insert(sql, [person.name, person.age, person.salary]);
  return result;
}

// 优化updatePerson
updatePerson(Person person) async {
  String sql = '''
     UPDATE PERSON SET 
     name = ?,
     age = ?,
     salary = ?
     WHERE 
     id = ?
  ''';
  int result = await update(sql, [person.name, person.age, person.salary, person.id]);
  return result;
}

参数化查询不仅安全,还能避免特殊字符导致的SQL语法错误。

验证修复

  1. 卸载旧应用(或清除应用数据,确保重新创建数据库)
  2. 重新运行应用,填写信息后点击保存,即可正常写入数据库,不再抛出异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:50:28