Flutter中如何将Future<List<Map<String, Object?>>>转为Future<int>?
问题描述
我有一段使用SQFLite的Flutter代码:
Future<List<Map<String, Object?>>> countRecords() async { final db = await instance.dataBase; final result = await db.rawQuery('SELECT COUNT(${Fields.Txt}) FROM $Table'); if(result.isNotEmpty) return result; else throw Exception('Empty Result'); }
另外一段运行失败的代码,错误原因是无法将Future<List<Map<String, Object?>>>赋值给Future<int>:
int Count = 0; Future<int> countTableRecords() async { return Count = await DBHelper.instance.countRecords(); }
我需要从SQFLite数据库中提取记录数量,当前查询返回的是Future<List<Map<String, Object?>>>类型,但我需要返回Future<int>,该怎么实现类型转换?
解决方案
SQFLite的rawQuery返回的是包含查询结果的列表,每个元素是键值对Map。对于COUNT()查询,结果列表里只会有一个Map,这个Map里的唯一值就是记录总数。可以通过以下两种方式实现类型转换:
方法1:直接修改countRecords方法返回int
把原方法改成直接返回int类型,后续调用更简洁:
Future<int> countRecords() async { final db = await instance.dataBase; final result = await db.rawQuery('SELECT COUNT(${Fields.Txt}) FROM $Table'); // 利用SQFLite工具方法提取第一个int值,为空则返回0兜底 return Sqflite.firstIntValue(result) ?? 0; }
这里的Sqflite.firstIntValue是SQFLite提供的工具方法,能自动从查询结果中提取第一个int值,避免手动解析的繁琐。
方法2:在countTableRecords中处理转换
如果不想修改原countRecords方法,可以在调用后手动解析结果:
int Count = 0; Future<int> countTableRecords() async { final records = await DBHelper.instance.countRecords(); // 从返回的列表中取出第一个Map,提取值并转为int Count = int.parse(records.first.values.first.toString()); return Count; }
由于原方法已经做了非空判断并抛出异常,直接使用records.first是安全的。
两种方法都能实现需求,推荐第一种,代码更简洁且更符合SQFLite的使用习惯。
内容的提问来源于stack exchange,提问作者DktPhl2018
相关产品推荐
相关产品推荐

