Flutter中SQLite插入无数据及salary列不存在错误求助
问题分析与解决方案
核心问题
报错DatabaseException(table PERSON has no column named salary (code 1 SQLITE_ERROR))的直接原因是:你的SQLite数据库中PERSON表不存在salary字段,但代码在执行数据插入/更新操作时,尝试向这个不存在的字段写入值,导致SQLite拒绝操作,同时数据无法保存到数据库。
分步解决
1. 检查并修正表创建语句
打开你的litedb.dart文件,找到创建PERSON表的SQL语句,确认是否包含salary字段。
- 错误的创建语句示例(缺少
salary):CREATE TABLE IF NOT EXISTS PERSON ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER ) - 修正后的语句(添加
salary字段,根据数据类型选择REAL/INTEGER):CREATE TABLE IF NOT EXISTS PERSON ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, age INTEGER, salary REAL -- 匹配你要存储的薪资数据类型 )
2. 更新数据库表结构
根据你的应用阶段选择合适的方式:
- 开发阶段:卸载重装应用
直接卸载设备/模拟器上的应用,旧的数据库文件会被删除。重启应用后,新的表创建语句会执行,生成包含salary字段的PERSON表。 - 已发布应用:执行ALTER TABLE语句
为了保留用户现有数据,需要在数据库升级逻辑中添加字段:final db = await openDatabase( 'your_db_name.db', version: 2, // 将版本号提高1(原版本如果是1,现在设为2) onCreate: (db, version) { // 执行初始表创建语句(包含salary字段) db.execute('CREATE TABLE IF NOT EXISTS PERSON (...)'); }, onUpgrade: (db, oldVersion, newVersion) { // 仅当旧版本低于新版本时执行字段添加操作 if (oldVersion < 2) { db.execute('ALTER TABLE PERSON ADD COLUMN salary REAL'); } }, );
3. 验证数据操作代码
确认插入/更新数据的代码中,salary字段的键名与表结构完全一致:
// 插入数据示例 await db.insert( 'PERSON', { 'name': '张三', 'age': 30, 'salary': 8000.0, // 键名必须和表字段名一致,注意大小写(SQLite不严格但尽量统一) }, );
4. 测试修复效果
重新运行应用,填写信息并点击保存,检查数据库是否成功写入数据,同时确认DatabaseException不再触发。
内容的提问来源于stack exchange,提问作者sayedoon ali
相关产品推荐
相关产品推荐

