Android真机上sqflite无法正常工作的排查与解决求助
问题修复方案
核心错误原因
报错提示no such column: false,本质是SQLite语法错误:
- SQLite本身没有
BOOLEAN类型,实际会自动转为INTEGER存储(0代表false,1代表true) - 你直接在SQL语句里写
false,SQL解析器会把它当成列名而非值,导致语法错误 - 模拟器可能因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. 物理设备生效操作
物理设备上可能残留旧版本的数据库(表结构不符合新定义),需要:
- 卸载设备上的旧应用
- 重新运行项目安装新版本
发布前注意事项
- 确保所有数据库操作都使用参数化查询,避免字符串拼接
- 数据库版本迭代时,必须通过
onUpgrade方法处理表结构变更,不能直接修改onCreate - 测试阶段要覆盖不同Android版本的物理设备,避免模拟器兼容差异导致的隐藏问题
内容的提问来源于stack exchange,提问作者Mohammed Al Shemmari
相关产品推荐
相关产品推荐

