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

Flutter SQFlite报错:bool类型无法转换为int类型求解

解决SQFlite读取日历事件时的bool与int类型转换错误

错误原因

报错type 'bool' is not a subtype of type 'int' in type cast的核心问题是:你在EventsDatabase的readEvent和readAllEvents方法中,提前将数据库返回的isAllDay字段(int类型的1/0)转换成了bool值,但EventHandler.fromJson方法仍然试图将这个bool值强制转换为int,导致类型不匹配。

解决方案

1. 统一类型转换逻辑,移除提前转换操作

将数据库读取后的类型转换逻辑统一放在EventHandler.fromJson中,不在数据库查询方法中提前修改返回的Map。

2. 修正查询参数的类型匹配

readEvent方法中,查询条件的startTime参数需要转换为毫秒数(与数据库存储的类型一致),否则无法匹配到数据。

修改后的代码

修正后的EventsDatabase类关键方法

// readEvent方法修改
Future<NeatCleanCalendarEvent?> readEvent(
    String summary, DateTime startTime) async {
  final db = await instance.database;

  final maps = await db.query(
    eventsTable,
    columns: EventFields.values,
    where: 'summary = ? AND startTime = ?',
    whereArgs: [summary, startTime.millisecondsSinceEpoch], // 转换为毫秒数匹配数据库存储
  );

  if (maps.isNotEmpty) {
    return EventHandler.fromJson(maps.first); // 直接传入原始查询结果
  } else {
    return null;
  }
}

// readAllEvents方法修改
Future<List<NeatCleanCalendarEvent>> readAllEvents() async {
  final db = await instance.database;

  final orderBy = 'startTime ASC';

  final result = await db.query(
    eventsTable,
    orderBy: orderBy,
  );

  return result.map((json) => EventHandler.fromJson(json)).toList(); // 直接传入原始查询结果
}

保持EventHandler类的原有逻辑(无需修改)

final String eventsTable = 'events';

class EventFields {
  static final List<String> values = [
    summary,
    description,
    startTime,
    endTime,
    isAllDay
  ];

  static final String summary = 'summary';
  static final String description = 'description';
  static final String startTime = 'startTime';
  static final String endTime = 'endTime';
  static final String isAllDay = 'isAllDay';
}

class EventHandler {
  Map<String, Object?> toJson(NeatCleanCalendarEvent event) => {
        EventFields.summary: event.summary,
        EventFields.description: event.description,
        EventFields.startTime: event.startTime.millisecondsSinceEpoch,
        EventFields.endTime: event.endTime.millisecondsSinceEpoch,
        EventFields.isAllDay: event.isAllDay ? 1 : 0, // 存库时转int
      };

  static NeatCleanCalendarEvent fromJson(Map<String, Object?> json) =>
      NeatCleanCalendarEvent(
        json[EventFields.summary] as String,
        description: json[EventFields.description] as String,
        startTime: DateTime.fromMillisecondsSinceEpoch(
            json[EventFields.startTime] as int),
        endTime: DateTime.fromMillisecondsSinceEpoch(
            json[EventFields.endTime] as int),
        isAllDay: (json[EventFields.isAllDay] as int) == 1, // 读库时转bool
      );
}

说明

  • 数据库中isAllDay字段定义为INTEGER DEFAULT 0,存储时通过EventHandler.toJson将bool转为1/0,读取时通过EventHandler.fromJson将1/0转回bool,逻辑统一且符合SQFlite的类型规范。
  • 修正readEvent的查询参数后,确保了查询条件与数据库存储值的类型一致,避免出现查询不到数据的问题。

内容的提问来源于stack exchange,提问作者Nandan Praveen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 07:17:06