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

Flutter待办应用将id设为自增主键但数据库存储值为null如何解决

问题原因
  • SQLite 建表语法不符合规范,导致id字段未被正确识别为自增主键:
    SQLite 中自增主键的正确语法为INTEGER PRIMARY KEY AUTOINCREMENT,你当前写的integer auto increment PRIMARY KEY存在两处错误:
    1. 自增关键字必须连写为AUTOINCREMENT,拆分写auto increment属于语法错误
    2. 主键声明必须前置,正确顺序是先声明PRIMARY KEY,再跟可选的AUTOINCREMENT关键字
      语法错误导致id字段只是普通的integer类型,插入时未主动赋值就会默认存储为null。
  • 额外存在的不规范问题:SQLite 本身不支持BOOLEAN类型,直接存储布尔字符串会导致后续查询判断逻辑异常,同时字符串拼接的插入方式存在SQL注入风险。
解决方案
  1. 修正建表语句,调整id字段定义,同时将布尔字段改为INTEGER类型存储:
    修改后_createDB方法中建表语句如下:
Future<Database> _createDB() async {
  if (_db != null) return _db!;
  String path = join(await getDatabasesPath(), 'todo.db');
  _db = await openDatabase(path, version: 1,
      onCreate: (Database database, int version) {
    return database.execute(
        "CREATE TABLE tasks (id INTEGER PRIMARY KEY AUTOINCREMENT, content TEXT, status varchar(15), isFinished INTEGER) ");
  }, onOpen: (_) {
    print("\n opened \n ");
  });
  return _db!;
}

注意:修改建表语句后需要卸载旧应用重新安装,或者将数据库版本号升级并添加onUpgrade逻辑,否则本地已创建的旧表结构不会更新。

  1. 改用参数化插入方式,避免SQL注入同时自动处理类型转换,插入成功后返回的int值就是生成的自增id,你可以赋值给对应的模型对象:
Future<int> insertNodeToDB(NoteDatabaseModel noteDatabaseModel) async {
  Database _database = await _createDB();
  return await _database.insert(
    'tasks',
    {
      'content': noteDatabaseModel.content,
      'status': noteDatabaseModel.status,
      'isFinished': noteDatabaseModel.isFinished ? 1 : 0,
    },
  );
}
  1. 数据查询时,要把数据库中存储的isFinished的1/0整数值转换回布尔类型即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 04:18:04