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

Android真机上sqflite无法正常工作的排查与解决求助

问题修复方案

核心错误原因

报错提示no such column: false,本质是SQLite语法错误:

  1. SQLite本身没有BOOLEAN类型,实际会自动转为INTEGER存储(0代表false,1代表true)
  2. 你直接在SQL语句里写false,SQL解析器会把它当成列名而非值,导致语法错误
  3. 模拟器可能因SQLite版本/环境兼容宽松暂时没暴露问题,但物理设备严格遵循语法规则

具体修复步骤

1. 修正表结构定义

将创建表时的BOOLEAN改为INTEGER(更符合SQLite实际存储逻辑):

_onCreate (Database db, int version)async{
  await db.execute('''
    CREATE TABLE "todo" (
        "id" INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT ,
        "task" TEXT NOT NULL ,
        "icon" INTEGER NOT NULL ,
        "isDone" INTEGER NOT NULL
    )
  ''');
  print("ONCREATE ####################################");
}

2. 修复插入数据的SQL写法

禁止直接拼接字符串生成SQL(存在语法错误+SQL注入风险),改用参数化查询:

insertData(String task, int icon)async{
  Database? mydb=await db;
  // 用?作为占位符,参数通过列表传入
  int response= await mydb!.rawInsert(
    'INSERT INTO todo(task, icon, isDone) VALUES(?, ?, ?)',
    [task, icon, 0] // 0对应false,1对应true
  );
  return response;
}

或者更推荐使用sqflite封装的insert方法:

insertData(String task, int icon)async{
  Database? mydb=await db;
  int response= await mydb!.insert(
    'todo',
    {'task': task, 'icon': icon, 'isDone': 0}
  );
  return response;
}

3. 物理设备生效操作

物理设备上可能残留旧版本的数据库(表结构不符合新定义),需要:

  • 卸载设备上的旧应用
  • 重新运行项目安装新版本

发布前注意事项

  1. 确保所有数据库操作都使用参数化查询,避免字符串拼接
  2. 数据库版本迭代时,必须通过onUpgrade方法处理表结构变更,不能直接修改onCreate
  3. 测试阶段要覆盖不同Android版本的物理设备,避免模拟器兼容差异导致的隐藏问题

内容的提问来源于stack exchange,提问作者Mohammed Al Shemmari

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 01:57:28