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

