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
相关产品推荐
相关产品推荐

