使用带有多个子句的where子句删除SQLite Row

时间:2012-08-28 15:25:12

标签: android sqlite where-clause sql-delete

我一直在寻找并没有设法找到解决方案或工作示例,所以这里。

我已经建立了一个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 });

2 个答案:

答案 0 :(得分:19)

我觉得KEY_DATEKEY_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"});

简化了转义值。