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语法错误。
验证修复
- 卸载旧应用(或清除应用数据,确保重新创建数据库)
- 重新运行应用,填写信息后点击保存,即可正常写入数据库,不再抛出异常。
内容的提问来源于stack exchange,提问作者Sayedoon
相关产品推荐
相关产品推荐

