存入SQL的BOOLEAN类型值查询取出时运行时类型为String怎么办?
问题原因
SQLite 本身没有原生 BOOLEAN 数据类型,官方设计中 BOOLEAN 是 INTEGER 的别名:约定存0代表false,1代表true。你当前查询返回字符串类型,是因为存入数据时直接把'true'/'false'字符串写入了字段,没有转成整数存储,读取时自然就拿到了String类型值。
解决方案
- 写入数据时统一转成整数类型
存isFinished字段前,先把bool值转成1/0再插入,示例写法:
database.insert('tasks', {'id': 1, 'isFinished': myBoolValue ? 1 : 0});
如果用rawInsert写法也遵循同样逻辑,把bool值转成数字再传入。
- 查询读取时增加类型兼容转换
读数据时增加兼容逻辑,不管拿到的是int还是String都统一转成bool,修改后的查询代码如下:
Future<bool> checkBoxValue({required int id})async{ Database? _database = await _createDB(); // 替换原有拼接SQL的写法为参数化查询,避免SQL注入风险 List<Map<String, Object?>> isFinished= await _database.rawQuery("SELECT isFinished from tasks where id = ?", [id]); Object? c= isFinished[0]['isFinished'] ; // 新增类型转换逻辑 bool result; if(c is int){ result = c == 1; }else if(c is String){ result = c.toLowerCase() == 'true' || c == '1'; }else{ result = false; // 异常场景默认值可根据业务需求调整 } print("\n isFinished:${result.runtimeType} \n"); return result; }
- (可选)批量修正历史数据
如果库里已经存了大量字符串格式的isFinished值,可执行一次批量更新把所有值转成整数,后续读取就会默认返回int类型:
database.execute("UPDATE tasks SET isFinished = CASE WHEN isFinished IN ('true', '1') THEN 1 ELSE 0 END");
内容的提问来源于stack exchange,提问作者Mariam Albarghouti
相关产品推荐
相关产品推荐

