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

存入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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 19:39:01