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

Flutter Sqflite问题:无法获取查询结果中waterDrank字段的值

解决rawQuery查询结果无法获取waterDrank字段的问题

问题根源

你代码里的核心错误是把rawQuery返回的结果元素当成了List,但实际上rawQuery返回的是List<Map<String, dynamic>>——每个查询结果行是一个Map,而不是List。你用List filteredData = result[0];强制转换类型,后续用索引[2]去取值自然会失败。

修正后的基础写法

直接按Map类型处理查询结果,通过键名waterDrank获取对应值:

static Future<List<Map<String, dynamic>>> getWaterDrank() async {
  final db = await WaterDBHelper.db();
  List<Map<String, dynamic>> result = await db.rawQuery(
    "SELECT * FROM $tableName WHERE ${columnDate} = ?", [dateCurrent]
  );
  print(result);
  if (result.isNotEmpty) {
    // 第一个结果是Map类型
    Map<String, dynamic> filteredData = result[0];
    // 通过键名获取waterDrank的值
    int waterDrank = filteredData['waterDrank'] as int;
    print('this is what we are after $waterDrank');
  }
  return result;
}

用模型类关联结果的正确方式

如果想用模型类统一处理数据,先定义模型:

class WaterRecord {
  final int id;
  final String date;
  final int waterDrank;

  WaterRecord({required this.id, required this.date, required this.waterDrank});

  // 从Map转换为模型实例
  factory WaterRecord.fromMap(Map<String, dynamic> map) {
    return WaterRecord(
      id: map['id'] as int,
      date: map['date'] as String,
      waterDrank: map['waterDrank'] as int,
    );
  }
}

然后修改数据库查询函数,将Map列表转换为模型列表:

static Future<List<WaterRecord>> getWaterDrank() async {
  final db = await WaterDBHelper.db();
  List<Map<String, dynamic>> result = await db.rawQuery(
    "SELECT * FROM $tableName WHERE ${columnDate} = ?", [dateCurrent]
  );
  // 批量转换为模型对象
  return result.map((row) => WaterRecord.fromMap(row)).toList();
}

调用时直接访问模型属性:

List<WaterRecord> records = await WaterDBHelper.getWaterDrank();
if (records.isNotEmpty) {
  print('今日饮水量:${records[0].waterDrank}');
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 22:20:00