Android中SQLite点击删除按钮行未删除且应用崩溃问题排查
问题排查与修复方案
首先,导致应用点击删除按钮后崩溃的核心原因是SQL语法错误,同时代码还存在SQL注入风险,我们来一步步拆解解决:
1. 直接拼接字符串引发的语法错误
你的deleteRow方法里直接把字符串类型的subject拼接到SQL语句中,但SQL语法要求字符串值必须用单引号包裹。比如当subject是"Math"时,生成的SQL语句会是:
delete from your_table where col2=Math
数据库会把Math当成一个列名而非字符串值,这直接触发了语法错误,导致应用强制关闭。
2. 更安全的修复方案(推荐)
永远不要直接拼接动态字符串到SQL语句中,这不仅容易引发语法错误,还会带来SQL注入风险。推荐使用SQLite提供的参数化查询方式:
修改DatabaseHelper.java中的deleteRow方法:
public void deleteRow(String subject) { SQLiteDatabase db = this.getWritableDatabase(); // 使用参数化delete方法,自动处理字符串转义和引号 db.delete(TABLE_NAME, COL_2 + " = ?", new String[]{subject}); db.close(); // 记得关闭数据库连接,避免资源泄漏 }
如果你坚持使用execSQL,也可以用占位符实现参数化:
public void deleteRow(String subject) { SQLiteDatabase db = this.getWritableDatabase(); db.execSQL("delete from " + TABLE_NAME + " where " + COL_2 + " = ?", new Object[]{subject}); db.close(); }
3. 额外的优化建议
- 空值检查:在调用删除方法前,先确认
subject不为空,避免空指针或无效SQL:public void onClick(View view) { if(view.getId()==R.id.deleteSubject) { Bundle extras = getIntent().getExtras(); if (extras != null) { String subject = extras.getString("subject"); if (subject != null && !subject.isEmpty()) { myDb.deleteRow(subject); // 可以添加删除成功后的反馈,比如提示或返回上一页 Toast.makeText(this, "Subject deleted successfully", Toast.LENGTH_SHORT).show(); finish(); } } } } - 异常捕获:给数据库操作添加try-catch块,避免崩溃并便于调试:
public void deleteRow(String subject) { SQLiteDatabase db = null; try { db = this.getWritableDatabase(); db.delete(TABLE_NAME, COL_2 + " = ?", new String[]{subject}); } catch (SQLException e) { e.printStackTrace(); // 这里可以添加错误提示或日志记录逻辑 } finally { if (db != null) { db.close(); } } }
内容的提问来源于stack exchange,提问作者Emma
相关产品推荐
相关产品推荐

