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

为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:38:21