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

安卓本地数据库删除函数失效,点击列表项应用崩溃求助

Android SQLite 删除功能崩溃问题排查与修复

核心问题分析

点击列表项崩溃的根源在于数据库操作的两处错误,和你使用Lambda表达式无关:

  1. SQL语句语法错误
    字符串拼接时未在关键字与表名/字段名之间添加空格,导致生成的SQL语句格式完全错误。比如原代码会生成类似 DELETE FROMcustomer_tableWHEREid=1 的语句,SQL解析器无法识别,直接抛出语法异常。

  2. 错误使用查询方法执行删除操作
    rawQuery() 仅用于执行查询类SQL语句(如SELECT),不能执行DELETE/INSERT/UPDATE这类修改数据的操作,强行调用会触发异常。


修复后的代码实现

方案1:使用参数化execSQL(推荐,避免SQL注入)

修改DatabaseHelper中的deleteOne方法:

public boolean deleteOne(CustomerModel customerModel) {
    SQLiteDatabase db = this.getWritableDatabase();
    try {
        // 补全空格,同时用参数绑定避免SQL注入
        String queryString = "DELETE FROM " + CUSTOMER_TABLE + " WHERE " + CUSTOMER_ID + " = ?";
        db.execSQL(queryString, new Object[]{customerModel.getId()});
        // 通过受影响行数判断是否删除成功
        return db.getChanges() > 0;
    } finally {
        db.close(); // 确保数据库连接关闭
    }
}

方案2:使用SQLite内置delete方法(更简洁安全)

这是Android官方推荐的数据库修改方式,无需手动拼接SQL:

public boolean deleteOne(CustomerModel customerModel) {
    SQLiteDatabase db = this.getWritableDatabase();
    try {
        // 参数1:表名;参数2:WHERE条件;参数3:条件占位符对应的值
        int rowsDeleted = db.delete(
            CUSTOMER_TABLE,
            CUSTOMER_ID + " = ?",
            new String[]{String.valueOf(customerModel.getId())}
        );
        return rowsDeleted > 0;
    } finally {
        db.close();
    }
}

额外优化建议

  • 给CustomerModel重写toString()方法,否则Toast中显示的clickedCustomer会是对象内存地址,无法直观展示删除的内容:
    @Override
    public String toString() {
        return "Customer{id=" + id + ", name='" + name + "'}";
    }
    
  • 确保ShowCustomersOnListView方法会重新查询数据库并刷新ListView的适配器,否则删除后列表不会实时更新。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 13:35:00