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

Flutter中如何读取SQLite数据库存储的badge角标数据

Flutter SQLite读取USER表单条badge字段实现方案

针对USER表仅存储单条通知角标记录的场景,直接固定主键ID为1做定向读写即可,不需要全表扫描,实现稳定且性能开销最低。

新增badge读取方法

在现有DatabaseHelper类中添加如下方法,未查询到存储值时默认返回角标初始值"0":

/// 读取存储的通知角标值
Future<String> getBadge() async {
  final Database db = await instance.database;
  // 固定查询id=1的全局配置行,仅读取需要的badge字段
  final List<Map<String, dynamic>> queryRes = await db.query(
    'USER',
    columns: ['badge'],
    where: 'id = ?',
    whereArgs: [1],
    limit: 1,
  );
  // 无存储记录时返回默认值0,有记录直接返回对应字段值
  return queryRes.isNotEmpty ? queryRes.first['badge'].toString() : "0";
}

配套badge更新方法

由于角标会随业务动态更新,建议配套使用主键冲突替换的更新逻辑,无需额外判断记录是否存在,从根源避免表中出现多条重复角标记录:

/// 更新通知角标值,记录不存在时自动插入
Future<void> updateBadge(String newBadgeValue) async {
  final Database db = await instance.database;
  await db.insert(
    'USER',
    // 固定主键id为1,保证表中永远只有1条角标记录
    {'id': 1, 'badge': newBadgeValue},
    // 主键冲突时直接覆盖原有值
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

业务层调用方式

在需要获取角标值的位置,直接异步调用读取方法即可,拿到值后转成数字类型就能直接传给UI角标组件使用:

// 读取当前存储的角标值
final String badgeStr = await DatabaseHelper.instance.getBadge();
// 转成整数供组件使用,转换失败默认取0
final int badgeCount = int.tryParse(badgeStr) ?? 0;

注意事项

  • 原有getGroceries方法存在逻辑耦合问题:USER表存储的是全局配置类数据,和购物清单(Grocery)业务无关,建议为Grocery业务单独创建数据表,不要混存不同业务模块的数据,避免查询逻辑混乱。
  • 数据库操作优先使用参数化查询写法,不要手动拼接SQL字符串,避免SQL注入风险。
  • 查询时按需指定读取的字段,不要默认查询全量字段,减少不必要的性能消耗。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 22:06:51