13

我一直在四处寻找,但没有找到解决方案或工作示例,所以就到这里了。

我已经建立了一个 SQLite 数据库,它有五个具有不同字段的列,可以有效地为用户构建一个列表。列表中会有多个相同的值,除了设置为自动递增的 ROWID。

一旦将值输入数据库,用户和程序都不会知道 ROWID,因此我希望用户能够删除包含所有其他四个字段的一行。

我的代码如下所示:

Database
            .delete(DATABASE_TABLE,
                    "KEY_DATE='date' AND KEY_GRADE='style2' AND KEY_STYLE='style' AND KEY_PUMPLEVEL='pumpLevel'",
                    null);

但这不会删除任何值。我几乎可以肯定这个命令的语法是罪魁祸首。

如何为具有多个 where 子句的删除命令格式化 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 });
4

2 回答 2

25

我有一种感觉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 注入攻击中投射自己:

.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 注入攻击以保护您的数据的第二条说明。

于 2012-08-28T15:33:35.057 回答
8

你应该使用:

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

这简化了转义值。

于 2012-08-28T15:39:45.140 回答