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

Gar*_*wen 10 sqlite android 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);
Run Code Online (Sandbox Code Playgroud)

但这并没有删除任何值.我几乎可以肯定这个命令的语法是罪魁祸首.

如何使用多个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 });
Run Code Online (Sandbox Code Playgroud)

Sam*_*Sam 20

我有一种感觉,KEY_DATE,KEY_GRADE,等你的Java变量名实际的列名.尝试将代码更改为:

.delete(DATABASE_TABLE,
        KEY_DATE + "='date' AND " + KEY_GRADE + "='style2' AND " +
        KEY_STYLE + "='style' AND " + KEY_PUMPLEVEL + "='pumpLevel'",
        null);
Run Code Online (Sandbox Code Playgroud)

此外,我认为'date','style'等存储在本地变量,你应该使用的whereArgs参数从Project自己的SQL注入攻击:

.delete(DATABASE_TABLE,
        KEY_DATE + "=? AND " + KEY_GRADE + "=? AND " +
        KEY_STYLE + "=? AND " + KEY_PUMPLEVEL + "=?",
        new String[] {date, grade, style, pumpLevel});
Run Code Online (Sandbox Code Playgroud)

(其中date = "date",grade = "style2"等)


从评论中添加

要删除最后一行,请使用:

.delete(DATABASE_TABLE,
        "ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + ")",
        null);
Run Code Online (Sandbox Code Playgroud)

要删除最后一个匹配的行,请尝试:

.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);
Run Code Online (Sandbox Code Playgroud)

但请参阅我关于SQL注入攻击的第二个注释来保护您的数据.


Die*_*ano 8

你应该使用:

Database.delete(DATABASE_TABLE,
                "KEY_DATE=? AND KEY_GRADE = ? AND KEY_STYLE = ? AND KEY_PUMPLEVEL = ?",
                 new String[]{"date", "style2", "style", "pumpLevel"});
Run Code Online (Sandbox Code Playgroud)

这简化了逃避价值.