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

Flutter SQLite更新选中数据异常:无法单独递增每个元素的value值

问题解决:选中元素value单独递增失败的修复方案

你的代码核心问题出在db.update的条件上——每次循环都用selected = 'true'作为更新条件,这会导致所有选中的记录被重复更新,最终所有记录的value会被最后一次循环的结果覆盖,无法实现单独递增。

比如遍历product2时,你把value设为3+1=4,执行update后,product2和product3的value都会变成4;接着遍历product3时,你用原数据里的value=2计算出3,但由于异步操作的执行顺序不确定,最后生效的更新会覆盖之前的结果,导致所有记录的value统一变成某一个值。

下面提供两种解决方案:

方案1:针对单条记录更新(适合需要额外处理每条数据的场景)

确保你的data表有唯一主键(比如id),修改更新逻辑,用主键定位单条记录:

Future<void> _updateSelectedProd() async {
  final db = await SQLHelper.db();
  final _data = await SQLHelper.getSelectedData();
  
  // 用for循环替代forEach,保证异步操作按顺序执行
  for (final element in _data) {
    final updatedData = {
      'price': 0.0,
      'value': int.parse(element['value']) + 1,
    };
    // 通过主键id定位当前记录,只更新这一条
    await db.update(
      'data',
      updatedData,
      where: 'id = ?',
      whereArgs: [element['id']],
    );
  }
  
  // 所有更新完成后再刷新数据和计算
  _refreshSelectedData();
  _calcSumPrices();
}

方案2:直接批量SQL更新(更高效,推荐)

不需要先查询所有选中记录,直接在数据库层面完成批量更新,一步到位:

Future<void> _updateSelectedProd() async {
  final db = await SQLHelper.db();
  
  // 用rawUpdate执行批量更新逻辑
  await db.rawUpdate('''
    UPDATE data 
    SET price = 0.0, value = value + 1 
    WHERE selected = ?
  ''', ['true']);
  
  _refreshSelectedData();
  _calcSumPrices();
}

这个方案更高效,避免了查询-循环-更新的冗余步骤,也不会出现异步顺序问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 07:35:02