通过EditText输入ID点击按钮无法删除SQLite数据库条目问题求助
问题排查与修复方案
1. 核心问题:删除方法的SQL条件写法错误
你当前的删除逻辑将整型的entryid用双引号包裹做字符串匹配,不仅和表结构中entryid的INTEGER类型不匹配,还存在SQL注入风险。同时原有代码未关闭数据库、未判断删除结果,会导致资源泄露和无法感知操作结果:
修复前代码
public void deleteEntry(Integer entryid){ SQLiteDatabase db = this.getWritableDatabase(); db.delete("data", "entryid" + "=\"" + entryid + "\"", null); }
修复后代码
// 返回受影响行数,方便上层判断是否删除成功 public int deleteEntry(Integer entryid){ SQLiteDatabase db = this.getWritableDatabase(); // 使用占位符绑定参数,自动适配字段类型,避免注入风险 int affectedRows = db.delete("data", "entryid = ?", new String[]{String.valueOf(entryid)}); db.close(); // 用完关闭数据库,避免资源泄露 return affectedRows; }
2. 点击事件缺少输入合法性校验
如果用户输入框为空、输入内容超出整型范围,直接调用Integer.parseInt会直接抛出异常导致崩溃,需要补充校验和操作提示:
修复后点击逻辑
@Override public void onClick(View v) { // [...] 其他原有逻辑 else if (v.equals(_btnDelete)){ String inputContent = _etDelete.getText().toString().trim(); // 先判断输入是否为空 if (inputContent.isEmpty()) { Toast.makeText(this, "请输入要删除的ID", Toast.LENGTH_SHORT).show(); return; } try { Integer targetId = Integer.parseInt(inputContent); int deleteCount = db.deleteEntry(targetId); if (deleteCount > 0) { Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show(); _etDelete.setText(""); // 清空输入框 // 如果当前页面有展示数据库条目的列表,这里需要调用刷新逻辑 // 示例:yourListAdapter.notifyDataSetChanged(); 或者重新查询数据库更新列表数据 } else { Toast.makeText(this, "不存在对应ID的条目", Toast.LENGTH_SHORT).show(); } } catch (NumberFormatException e) { Toast.makeText(this, "输入的ID格式非法", Toast.LENGTH_SHORT).show(); } }
其他注意事项
- 如果你的数据库是之前创建的、未包含
entryid字段,需要卸载应用重装触发数据库重建,或者做数据库版本升级更新表结构 - 若删除后界面展示的条目没有变化,基本都是没有刷新列表数据导致,不是删除功能失效
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

