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

Flutter中使用sqflite存储数据时出现语法错误求助

问题核心原因分析

从报错信息能看出两个关键问题:

  • 字符串值未加单引号:SQL解析时会把空格分隔的内容(比如"Butter Chicken"里的"Chicken")当成无效语法,触发syntax error
  • 表结构不匹配:部分报错显示table recipeTable has no column named recipeCategory,说明你的表定义中缺少该字段或字段名拼写错误

解决方案

1. 用参数化查询修复语法错误(避免SQL注入)

直接拼接字符串到SQL里既容易触发语法错误,还存在SQL注入风险,改用sqflite支持的参数占位符:

Future<String> saveRecipe(int recipesId, String recipesName, String recipesCategory) async {
  try{
    var dbClient = await db;
    // 使用?作为占位符,参数通过列表传入
    await dbClient!.rawQuery(
      'INSERT INTO $recipeTable ($recipeId, $recipeName, $recipeCategory) VALUES (?, ?, ?)',
      [recipesId, recipesName, recipesCategory]
    );
    return 'Success';
  }catch(e){
    print('存储失败详情: $e');
    return 'Failure';
  }
}

2. 检查表结构,确保recipeCategory字段存在

找到你创建recipeTable的代码,确认包含recipeCategory字段,示例如下:

// 创建表的示例代码
await dbClient!.execute('''
  CREATE TABLE $recipeTable (
    $recipeId INTEGER PRIMARY KEY,
    $recipeName TEXT NOT NULL,
    $recipeCategory TEXT -- 必须存在这个字段
  )
''');

如果之前已经安装过App,需要卸载后重新安装(或实现数据库迁移逻辑),否则表结构修改不会生效。

3. 推荐使用sqflite内置的insert方法(更简洁安全)

sqflite提供了封装好的insert方法,无需手写原生SQL,自动处理参数和字段映射:

Future<String> saveRecipe(int recipesId, String recipesName, String recipesCategory) async {
  try{
    var dbClient = await db;
    await dbClient!.insert(
      recipeTable,
      {
        recipeId: recipesId,
        recipeName: recipesName,
        recipeCategory: recipesCategory
      }
    );
    return 'Success';
  }catch(e){
    print('存储失败详情: $e');
    return 'Failure';
  }
}

内容的提问来源于stack exchange,提问作者Ahmed Raza

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:10:26