Szukałem i nie udało mi się znaleźć rozwiązania ani działającego przykładu, więc zaczynam.

Skonfigurowałem bazę danych SQLite, która ma pięć kolumn z różnymi polami, co skutecznie buduje listę dla użytkownika. Na liście będzie wiele takich samych wartości, z wyjątkiem ROWID, który jest ustawiony na automatyczne zwiększanie.

Ani użytkownik, ani program nie znają ROWID po wprowadzeniu wartości do bazy danych, dlatego chcę, aby użytkownik mógł usunąć jeden wiersz, jeśli zawiera wszystkie cztery pozostałe pola.

Mój kod wygląda tak:

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

Ale to nie usuwa żadnych wartości. Jestem prawie pewien, że winna jest składnia tego polecenia.

Jak sformatować klauzulę WHERE dla polecenia usuwania z wieloma klauzulami WHERE?

Rozwiązanie od dołu:

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 });
13
Gareth Bowen 28 sierpień 2012, 19:25

2 odpowiedzi

Najlepsza odpowiedź

Mam wrażenie, że KEY_DATE, KEY_GRADE itd. to nazwy zmiennych Java nie rzeczywiste nazwy kolumn. Spróbuj zmienić kod na następujący:

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

Zakładam również, że 'date', 'style', itp. są przechowywane w zmiennych lokalnych, powinieneś użyć parametru whereArgs, aby zaprojektować siebie z Ataki wstrzykujące SQL:

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

(gdzie date = "date", grade = "style2" itd.)


Dodano z komentarzy

Aby usunąć ostatni wiersz, użyj tego:

.delete(DATABASE_TABLE,
        "ROWID = (SELECT Max(ROWID) FROM " + DATABASE_TABLE + ")",
        null);

Aby usunąć ostatni pasujący wiersz, spróbuj tego:

.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);

Ale zobacz moją drugą notatkę na temat ataków typu SQL Injection Attack, aby chronić swoje dane.

24
Sam 28 sierpień 2012, 21:45

Powinieneś użyć:

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

Co upraszcza wymykanie się wartości.

8
Vishal Yadav 31 sierpień 2017, 16:33