【问题标题】:Delete SQLite Row with where clause with multiple clauses使用带有多个子句的 where 子句删除 SQLite Row
【发布时间】:2012-08-23 03:43:28
【问题描述】:

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

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

【问题讨论】:

    标签: android sqlite where-clause sql-delete


    【解决方案1】:

    我感觉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" 等)


    从 cmets 添加

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

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

    【讨论】:

    • 对不起,我意识到我在这里问了一个愚蠢的问题。行仅由自动递增的 ROWID 标识。我真正想做的是删除最新的 ROWID,其中包含与作为上下文传递的值匹配的字段。你有什么建议吗?
    • 我仍然不确定您的确切问题...但是如果您有多行 KEY_DATE = 'date' 等,并且想要删除最后一个匹配行:您可以结合我的最后两个建议。
    • 它有效。谢谢。如果不是太麻烦,你能解释一下它是如何工作的,因为我不明白它是如何知道要查找哪些值的。
    • 当然,SELECT Max(ROWID) 返回 ROWID 的最大值,这是因为您使用自动递增键而添加的最后一行。所以实际上你有两个命令发生SELECT... 找到最大的ROWID 并将这个值传递给你的.delete(...) 命令。查看this guide了解各种SQL函数如Count()、Max()、Min()等的详细解释
    • PS 请点击我回答左上角的复选标记,将您的问题标记为已解决。
    【解决方案2】:

    你应该使用:

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

    这简化了转义值。

    【讨论】:

    • 这几乎可以完美运行。出于某种原因,我必须使用与键关联的字符串值。 IE。而不是KEY_DATE,我使用的是date。不幸的是,这会删除所有符合日期、等级、样式和泵级别标准的值。我想要做的是只删除其中一个值并保留其余值。这段代码可以适应吗?
    • 您应该使用唯一的主键从表中删除行,因此只有一行匹配。
    • 对不起,我很抱歉,但是我怎样才能找到与我正在寻找的四个值匹配的行的 rowid?
    • 您应该问自己的问题是,为什么要插入仅在其 rowid 上不同的行(如果您正在这样做)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    • 2018-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多