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

