【问题标题】:Missing column when setting up sqflite database table设置 sqflite 数据库表时缺少列
【发布时间】:2019-07-05 10:22:49
【问题描述】:

我目前正在使用 Flutter 框架开发一个 android 应用程序。 为了设置数据库,我使用 sqflite 插件。

设置数据库的工作如下:

  Future<Database> getDbModelDevice() async {
    return openDatabase(join(await getDatabasesPath(), dbNameDevice),
        onCreate: (db, version) {
      return db.execute("""
      CREATE TABLE $tableNameDevice (
        id INTEGER PRIMARY KEY, 
        name TEXT NOT NULL, 
        ip TEXT NOT NULL
        )""");
    },
    version: 1,
    );
  }

这按预期工作并使用表创建数据库。 我对这个话题很陌生,所以我不知道你是否能以某种方式看到创建的表的结构。我尝试通过在其中插入设备来测试新表:

Future<void> insertDevice(Device device) async {
  db.insert(
    tableNameDevice, 
    device.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

Map<String, dynamic> toMap() {
  return {
    'id': id,
    'name': name,
    'ip': ip,
  };
}

当调用函数 insertDevice 时,我收到以下错误消息:

[ERROR:flutter/lib/ui/ui_dart_state.cc(148)] Unhandled Exception: DatabaseException(table deviceTable has no column named ip (code 1): , while compiling: INSERT OR REPLACE  INTO deviceTable (id, name, ip) VALUES (?, ?, ?)) sql 'INSERT OR REPLACE  INTO deviceTable (id, name, ip) VALUES (?, ?, ?)' args [0, testInsertion, 0.0.0.0]}

其他列似乎有效,因为在 toMap() 中注释掉参数 ip 时插入有效strong> 函数插入设备时不会出错。

我在这里缺少什么?非常感谢任何帮助。

【问题讨论】:

  • 你卸载了应用程序吗?
  • 对此最明显的解释是您的表实际上不包含ip 列。您应该删除该表,然后重新创建它并验证所有列是否确实存在。
  • @abdul 直到现在我才尝试过flutter clean,但我现在会尝试卸载。
  • @TimBiegeleisen 你知道一种有效的方式来以某种方式描述表格吗?

标签: android flutter dart sqflite


【解决方案1】:

@TimBiegeleisen 的评论帮助我解决了这个问题。 我正在查看我定义的删除表的函数,发现我删除了错误的表。

自从我修复了它现在它按预期工作。

感谢您的回答!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-30
    相关资源
    最近更新 更多