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

通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 15:15:08