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 });
2 odpowiedzi
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.
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.
Podobne pytania
Powiązane pytania
Nowe pytania
android
Android to mobilny system operacyjny Google, używany do programowania lub tworzenia urządzeń cyfrowych (smartfony, tablety, samochody, telewizory, Wear, Glass, IoT). W przypadku tematów związanych z Androidem użyj tagów specyficznych dla Androida, takich jak android-intent, android-activity, android-adapter itp. W przypadku pytań innych niż programowanie lub programowanie, ale związanych ze strukturą Androida, użyj tego linku: https: // android.stackexchange.com.