安卓本地数据库删除函数失效,点击列表项应用崩溃求助
Android SQLite 删除功能崩溃问题排查与修复
核心问题分析
点击列表项崩溃的根源在于数据库操作的两处错误,和你使用Lambda表达式无关:
SQL语句语法错误
字符串拼接时未在关键字与表名/字段名之间添加空格,导致生成的SQL语句格式完全错误。比如原代码会生成类似DELETE FROMcustomer_tableWHEREid=1的语句,SQL解析器无法识别,直接抛出语法异常。错误使用查询方法执行删除操作
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
相关产品推荐
相关产品推荐

