如何使用sqflite在数据库中存储DateTime类型数据且切换页面不丢失
sqflite DateTime类型存储及持久化方案
sqflite本身仅支持Integer、Real、Text、Blob四种基础数据类型,无原生DateTime支持,必须通过类型转换实现持久化,只要数据成功写入数据库,切换页面不会丢失已存储内容。
两种常用存储实现方案
- 方案1:毫秒时间戳存储(Integer类型)
存储阶段调用DateTime实例的millisecondsSinceEpoch属性,获取13位毫秒级时间戳,作为整数存入数据库;读取阶段调用DateTime.fromMillisecondsSinceEpoch(时间戳数值)即可转换回DateTime对象。
示例代码:
入库转换:
读库转换:// 实体类转数据库可识别的Map Map<String, dynamic> toDbMap() { return { 'id': id, 'create_time': createTime.millisecondsSinceEpoch, // 其他业务字段 }; }// 数据库查询结果转实体类 static List<YourModel> fromDbList(List<Map<String, dynamic>> dbList) { return dbList.map((item) => YourModel( id: item['id'], createTime: DateTime.fromMillisecondsSinceEpoch(item['create_time']), )).toList(); } - 方案2:ISO8601字符串存储(Text类型)
存储阶段调用DateTime实例的toIso8601String()方法,转为标准格式时间字符串存入数据库;读取阶段调用DateTime.parse(时间字符串)即可转换回DateTime对象,该方案存储的内容可读性更强,无需处理时间戳精度兼容问题。
注意:不可直接将DateTime对象传入sqflite的insert/update方法,框架不会自动做兼容转换,会默认调用toString方法存储为非标准格式字符串,后续无法正常解析。
切换页面数据不丢失操作要点
- 写库操作需添加
await关键字等待执行完成,确保数据成功持久化后再执行页面跳转逻辑,避免异步操作未完成就切走导致数据丢失。 - 新页面初始化(如initState生命周期)时,主动调用数据库查询方法拉取已存储的时间数据,渲染到页面即可,sqflite的存储是本地持久化的,和页面生命周期无关,只要数据写入成功就不会因为页面切换消失。
内容的提问来源于stack exchange,提问作者Nina
相关产品推荐
相关产品推荐

