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

React Native SQLite 增删功能异常:训练组添加/删除无效,数据显示与保存不符合预期

React Native SQLite 增删功能异常:训练组添加/删除无效,数据显示与保存不符合预期

兄弟,我瞅了下你贴的训练记录APP代码,发现几个关键问题导致训练组(set)增删无效、数据保存不生效,帮你一一拆解修复:

1. 最致命的问题:addSet 函数代码直接写断了

你贴的Workout组件里的addSet函数只写到const result = await就没了,这函数根本跑不起来,点击添加按钮当然没反应!先补全完整的添加逻辑:

async function addSet() {
  await ensureNameColumnExists();
  try {
    if (!name || name.trim() === "") {
      console.log("Greška: Ime ne može biti prazno.");
      return;
    }
    const dbConn = await initDB();
    // 插入新的训练组,和现有组保持相同的dayId、name、userId,初始字段留空
    const result = await dbConn.runAsync(
      `INSERT INTO workouts (dayId, name, userId, reps, load, rpe) VALUES (?, ?, ?, '', '', '')`,
      [dayId, name.trim(), userId]
    );
    // 插入后立刻刷新训练组列表,更新UI
    const updatedSets = await dbConn.getAllAsync(
      `SELECT * FROM workouts WHERE dayId = ? AND name = ? ORDER BY id ASC`,
      [dayId, name.trim()]
    );
    setSets(updatedSets);
    console.log(`Uspješno dodan set ID: ${result.lastInsertRowid}`);
  } catch (e) {
    console.log("Greška kod dodavanja seta:", e);
  }
}

2. Selector 组件更新字段时的作用域错误

你的Selector里的updateField函数用了String(result[field])来判断值是否变化,但result是fetchData内部的变量,这里根本访问不到,直接报错导致更新逻辑完全失效!改成用组件自身的状态值对比:

const updateField = async (field, value) => {
  // 从组件当前状态里取对应字段的现有值
  const currentValue = {
    reps: reps,
    load: load,
    rpe: rpe
  }[field];
  
  // 空值或者值没变化就直接返回
  if (value === '' || value === currentValue) return; 
  try {
    const dbConn = await initDB();
    await dbConn.runAsync(
      `UPDATE workouts SET ${field} = ? WHERE id = ?`,
      [value, id]
    );
  } catch (e) {
    console.log(`Greška kod spremanja polja ${field}:`, e);
  }
};

3. 删除功能的逻辑缺失与状态刷新

你说删除无效,主要是因为没有实现完整的删除逻辑,也没在删除后刷新训练组列表:

第一步:在Workout组件里写删除单个训练组的函数

const deleteSet = async (setId) => {
  try {
    const dbConn = await initDB();
    await dbConn.runAsync(
      `DELETE FROM workouts WHERE id = ?`,
      [setId]
    );
    // 删除后立刻刷新列表,更新UI
    const updatedSets = await dbConn.getAllAsync(
      `SELECT * FROM workouts WHERE dayId = ? AND name = ? ORDER BY id ASC`,
      [dayId, name.trim()]
    );
    setSets(updatedSets);
  } catch (e) {
    console.log("Greška kod brisanja seta:", e);
  }
};

第二步:给Selector传入这个删除函数

把渲染Selector时的onDelete改成我们刚写的deleteSet:

// 假设你在Workout里是这么渲染Selector的
{sets.map((set, index) => (
  <Selector
    key={set.id}
    id={set.id}
    setNum={index + 1}
    userId={userId}
    dayId={dayId}
    onDelete={deleteSet} // 传入删除函数
  />
))}

4. 额外的细节优化

  • 所有SQL操作后记得手动刷新sets状态:不管是增、删、改,执行完SQL后都要重新查询数据库并调用setSets,这样UI才会同步更新
  • 调试时多打印日志:比如在addSet里打印插入的新ID,deleteSet里打印删除的ID,方便定位问题
  • 检查SQLite表结构:确保workouts表的id是自增主键,dayId、userId、name等字段都正确创建

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 10:58:08