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

Android Java中SQLite数据表删除失效问题排查求助

SQLite删除数据重启后恢复的问题排查与修复

问题现象

执行删除操作后弹出「Deleted Successfully」提示,但重启应用后目标数据依然存在,Logcat存在对应错误(结合代码可定位问题根源)。

核心问题分析与修复

1. ContactsDetailsDbAdapter中r()方法逻辑完全错误

当前r()方法接收前缀、目标值、后缀三个参数,但直接返回了目标值str,导致删除条件完全失效:

// 错误的r()方法
private String r(String s, String str, String s1) {
    this.s = s;
    this.str = str;
    this.s1 = s1;
    return str; // 此处未做字符串拼接,直接返回传入的group ID
}

调用r("contact_group_id='", str, "'")时,实际返回的是str(即group的ID值),相当于执行了DELETE FROM 表 WHERE [group_id的值]——这种条件不符合SQL语法,根本不会删除任何数据。

修复方案:修改r()方法为正确的字符串拼接逻辑:

private String r(String prefix, String value, String suffix) {
    return prefix + value + suffix;
}

2. GroupDetailsDbAdapter存在SQL语法错误与注入风险

当前用StringBuilder直接拼接删除条件,若group_id是字符串类型,会缺失单引号,导致条件匹配失败(比如group_id为字符串"1001",拼接后是group_id=1001,数据库会将其视为数字,无法匹配字符串类型的ID);同时这种写法存在SQL注入风险。

修复方案:改用SQLite参数化查询,避免手动拼接:

public boolean deleteData(String str) {
    // 使用?作为占位符,传入参数数组
    return this.mDb.delete(DATABASE_TABLE, "group_id=?", new String[]{str}) > 0;
}

3. 优化建议:统一使用参数化查询(彻底避免拼接错误)

ContactsDetailsDbAdapter的deleteGroupData()也建议改用参数化写法,彻底规避拼接错误和注入风险:

public void deleteGroupData(String str) {
    this.mDb.delete(DATABASE_TABLE, "contact_group_id=?", new String[]{str});
}

4. 额外优化:根据数据库操作结果提示用户

当前代码直接提示删除成功,未校验实际删除行数,建议根据delete()方法返回的受影响行数判断操作结果:

// 在ContactsList的长按事件中修改
int deletedGroups = groupDetailsDbAdapter.deleteData(str);
int deletedContacts = contactsDetailsDbAdapter.deleteGroupData(str);
if (deletedGroups > 0 || deletedContacts > 0) {
    Toast.makeText(ContactsList.this, "Deleted Successfully", Toast.LENGTH_SHORT).show();
} else {
    Toast.makeText(ContactsList.this, "Delete Failed", Toast.LENGTH_SHORT).show();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:25:34