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
相关产品推荐
相关产品推荐

