为SQLite删除功能添加AND语句导致应用崩溃求助
解决删除记录时Cursor执行崩溃的问题
嘿,我一眼就看到你的问题所在了——SQL语句里的语法错误!这是导致Cursor执行时崩溃的直接原因。
你看这两行SQL代码:
Cursor c = db.rawQuery("SELECT * FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''", null);
和
db.execSQL("DELETE FROM customer WHERE fname='" + fname.getText() + "' AND lname='" + lname.getText() + "''");
在lname的条件里,你最后写了两个单引号(''),但正确的应该只有一个。多出来的这个单引号会让SQL解析器完全搞不懂你的语句,直接抛出语法异常,导致应用崩溃。
第一步:修复语法错误
先把多余的单引号去掉,改成这样:
String firstName = fname.getText().toString().trim(); String lastName = lname.getText().toString().trim(); Cursor c = db.rawQuery("SELECT * FROM customer WHERE fname='" + firstName + "' AND lname='" + lastName + "'", null);
db.execSQL("DELETE FROM customer WHERE fname='" + firstName + "' AND lname='" + lastName + "'");
这里我还把输入文本先trim后存到变量里,避免重复调用getText(),代码会更整洁,也能减少不必要的对象创建。
第二步:更安全的写法(避免SQL注入)
虽然修复语法错误能解决崩溃问题,但直接拼接字符串写SQL是很危险的,容易遭遇SQL注入攻击。推荐你用Android提供的参数化查询方法,既安全又能彻底避免这类语法错误:
查询是否存在记录
String firstName = fname.getText().toString().trim(); String lastName = lname.getText().toString().trim(); Cursor c = db.query( "customer", null, "fname = ? AND lname = ?", new String[]{firstName, lastName}, null, null, null );
删除记录
甚至可以直接用delete()方法,不用自己手写DELETE语句:
int rowsDeleted = db.delete( "customer", "fname = ? AND lname = ?", new String[]{firstName, lastName} ); if (rowsDeleted > 0) { showMessage("Success", "Record Deleted"); } else { showMessage("Error", "Invalid First and Last Name"); }
这样不仅不用再担心单引号的问题,还能有效防止SQL注入,代码也更符合Android数据库操作的规范。
内容的提问来源于stack exchange,提问作者Tanner Tattini
相关产品推荐
相关产品推荐

