我一直在寻找并没有设法找到解决方案或工作示例,所以这里。
我已经建立了一个SQLite数据库,该数据库有五列不同的字段,可以为用户有效地构建列表。列表中将有多个值相同,除了设置为自动增量的ROWID。
一旦将值输入数据库,用户和程序都不会知道ROWID,因此如果用户包含所有其他四个字段,我希望用户能够删除一行。
我的代码如下所示:
Database
.delete(DATABASE_TABLE,
"KEY_DATE='date' AND KEY_GRADE='style2' AND KEY_STYLE='style' AND KEY_PUMPLEVEL='pumpLevel'",
null);
但这并没有删除任何值。我几乎可以肯定这个命令的语法是罪魁祸首。
如何使用多个where子句格式化delete命令的where子句?
以下解决方案:
ourDatabase.delete(DATABASE_TABLE, "ROWID = (SELECT Max(ROWID) FROM "
+ DATABASE_TABLE + " WHERE " + "date=? AND grade=? AND "
+ "style=? AND pump_level=?)", new String[] { date, grade,
style, pumpLevel });
答案 0 :(得分:19)
我觉得KEY_DATE
,KEY_GRADE
等是您的Java变量名而不是您的实际列名。尝试将代码更改为:
.delete(DATABASE_TABLE,
KEY_DATE + "='date' AND " + KEY_GRADE + "='style2' AND " +
KEY_STYLE + "='style' AND " + KEY_PUMPLEVEL + "='pumpLevel'",
null);
此外,我假设'date'
,'style'
等存储在本地变量中,您应该使用whereArgs
参数从SQL Injection Attacks预测自己:
.delete(DATABASE_TABLE,
KEY_DATE + "=? AND " + KEY_GRADE + "=? AND " +
KEY_STYLE + "=? AND " + KEY_PUMPLEVEL + "=?",
new String[] {date, grade, style, pumpLevel});
(date = "date"
,grade = "style2"
等)
从评论中添加
要删除最后一行,请使用:
.delete(DATABASE_TABLE,
"ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + ")",
null);
要删除上一个匹配的行,请尝试以下操作:
.delete(DATABASE_TABLE,
"ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + " WHERE " +
"KEY_DATE='date' AND KEY_GRADE='style2' AND " +
"KEY_STYLE='style' AND KEY_PUMPLEVEL='pumpLevel')",
null);
但请参阅我关于SQL注入攻击的第二个注释来保护您的数据。
答案 1 :(得分:8)
您应该使用:
Database.delete(DATABASE_TABLE,
"KEY_DATE=? AND KEY_GRADE = ? AND KEY_STYLE = ? AND KEY_PUMPLEVEL = ?",
new String[]{"date", "style2", "style", "pumpLevel"});
简化了转义值。