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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:55:16