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

React Native中如何通过ID删除SQLite数据库中的行

长按删除SQLite对应ID记录的问题与解决方案

问题描述

我希望用户长按列表条目时,删除SQLite数据库表中对应ID的记录,但不知道对应的查询语句,尝试写了一段逻辑,代码如下:

onLongPress={()=> {
        let n = item.ID.toString();
        Alert.alert(n)
        db.transaction(txn => {
          txn.executeSql(
            `SELECT * FROM Users ORDER BY ID DESC`,
            [],
            (sqlTxn, res) => {
              console.log("Users retrieved successfully");
              let len = res.rows.length;
              setNumbers([])
      
              if (len > 0) {
                for (let i = 0; i < len; i++) {
                  let item = res.rows.item(i);
                  if(item.ID!==n){
                    results.push({ ID: item.ID, number: item.CnicNumbers });
                    setNumbers(results);
                  }
                }
                getData();
                console.log(results);
              }
            },
            error => {
              console.log("error on getting users " + error.message);
            },
          );
        });
      }}

你的代码存在的问题

  • 逻辑方向错误:你现在只是把不等于目标ID的记录过滤后重新设置到前端状态里,数据库里的目标记录根本没被删除——下次重新获取数据时,那条记录还会出现。
  • 状态更新混乱:setNumbers(results)在循环里多次调用,React状态更新是异步的,这么做会导致状态更新不及时;而且直接修改results数组再传给状态,属于修改引用类型,React可能检测不到变化。
  • 效率极低:每次长按都要查询全表数据,完全没必要,直接针对目标ID执行删除操作即可。

正确实现方式

直接用SQL的DELETE语句删除对应ID的记录,操作完成后重新获取最新数据更新前端状态:

onLongPress={() => {
  const targetId = item.ID;
  // 增加确认弹窗,防止误触
  Alert.alert(
    "确认删除",
    "你确定要删除这条记录吗?",
    [
      { text: "取消", style: "cancel" },
      { 
        text: "删除", 
        onPress: () => {
          db.transaction(txn => {
            txn.executeSql(
              // 参数化查询,避免SQL注入风险
              `DELETE FROM Users WHERE ID = ?`,
              [targetId], // 传入要删除的ID
              (sqlTxn, res) => {
                if (res.rowsAffected > 0) {
                  console.log("记录删除成功");
                  // 删除后重新获取最新数据,更新前端状态
                  getData();
                } else {
                  console.log("未找到对应ID的记录");
                }
              },
              error => {
                console.log("删除失败: " + error.message);
              }
            );
          });
        }
      }
    ]
  );
}}

关键说明

  • 标准DELETE语句:DELETE FROM Users WHERE ID = ?是SQL删除指定记录的标准写法,?是参数占位符,用来传入目标ID。
  • 参数化查询:把targetId放在数组里作为第二个参数传入,这是SQLite操作的规范写法,比直接拼接字符串安全,能避免SQL注入。
  • 确认弹窗:添加确认步骤,减少用户误触导致的数据丢失。
  • 同步前端状态:删除成功后调用getData()重新拉取数据,确保前端显示的是数据库最新状态。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 19:31:13