Удалить строку SQLite с предложением where с несколькими оговорками

Я искал вокруг и не смог найти решение или рабочий пример, вот так.

Я создал базу данных 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 }); 

Solutions Collecting From Web of "Удалить строку SQLite с предложением where с несколькими оговорками"

У меня такое чувство, что 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 в локальных переменных, вы должны использовать параметр 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 Injection Attacks для защиты ваших данных.

Вы должны использовать:

База данных

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

Который упрощает экранирование значений.