2013-01-16 11 views
17

Chcę usunąć wiersze, które spełniają dowolne z wielu warunków.Jak usunąć wiersze w SQLite z wieloma argumentami, gdy argumenty?

Na przykład przekazuję listę identyfikatorów i chcę usunąć wszystkie wiersze z tymi IDs (identyfikatory są unikalne).

Byłoby to:

String[] ids = {"0", "1", "2", "3",...}; 
database.delete("rows" , "id=? OR id=? OR id=? OR id=? OR ..." , ids); 

Czy istnieje jakiś sposób, aby zrobić to kompaktowy bez wielokrotności OR?

+0

SQL, można użyć DISTINCT. – Derek

+0

użyj DELETE FROM your_table_name WHERE ID IN (ids [0], ids [1], ...) – Alpay

Odpowiedz

49

Możesz to zrobić za pomocą metody i słowa kluczowego SQL: IN. Na przykład:

String args = TextUtils.join(", ", ids); 

db.execSQL(String.format("DELETE FROM rows WHERE ids IN (%s);", args)); 
+0

Jeden sposób to zrobić: for (int i = 0; i LopezAgrela

+6

możesz to zrobić, ale w takim przypadku będzie wykonywał kilka razy wyrażenie sql i ma wpływ na wydajność. Zamiast tego proponuję użyć instrukcji ** IN ** do wykonania kwerendy zbiorczo. – waqaslam

+2

To jest ładne i krótkie, ale nie używa wiązania parametrów, co jest problemem bezpieczeństwa. Co jeśli zdarzy się, że jest id: '1) LUB (1 = 1' ... –

1

można użyć id IN (1, 2, 3, 4, ...) i bezpośrednio wydrukować wartości tablicy w nawiasie:

database.delete("rows", String.format("id IN (%s)", StringUtils.join(ids, ","))); 

Jako alternatywa, chciałbym spróbować użyć jakiegoś flags kolumny do takich rzeczy (jeśli jest coś takiego jak możliwość oznaczania pojedynczych wpisów do usunięcia, nie wiem, jak twoja lista identyfikacyjna jest "zbudowana").

+0

Jednym ze sposobów na to jest: for (int i = 0; i LopezAgrela

+0

Jeśli nie pracujesz z tablicą, możesz po prostu użyć pętli podobnej do twojej, łączącej ciąg ze wszystkimi identyfikatorami (w zasadzie taki sam jak wynik z 'StringUtils.join() '. – Mario

+0

Aby spełnić 3 argumenty potrzebne do' delete() ', musisz dodać' new String [] {} '. – darrenp

16

Co chcesz użyć to klauzula IN, coś w stylu (z 4 identyfikatorami);

database.delete("rows", "id IN (?, ?, ?, ?)", ids); 

Na życzenie jest to (jeden przykład), jak można to zrobić dynamicznie;

database.delete("rows", 
    "id IN (" + new String(new char[ids.length-1]).replace("\0", "?,") + "?)", 
    ids); 
+0

Ale problem polega na tym, że mam wiele identyfikatorów w tablicy "ids", może 4 lub może 1000 identyfikatorów. – LopezAgrela

+0

Jednym ze sposobów jest: dla (int i = 0; i LopezAgrela

+0

@alberking Dodano wersję dynamiczną. –

0

Oto przykład, który buduje łańcuch znaków "?,?,?, ..." za pomocą StringBuilder. Jeśli istnieje wiele parametrów, zwykłe połączenie ciągów spowoduje dużo śmieci, a StringBuilder pomaga w tym.

String[] ids = {"0", "1", "2", "3",...}; 

StringBuilder placeholders = new StringBuilder(); 
for (int i = 0; i < ids.length; i++) { 
    if (i != 0) 
     placeholders.append(", "); 

    placeholders.append("?"); 
} 

String where = "id IN (" + placeholders.toString() + ")"; 

db.delete("rows", where, args); 
3

Zrobiłem to za pomocą tego:

Sqlite komunikat Składnia:

db.delete(TABLE_NAME,"COLUMN IN (?)", new String[]{commaSaparatedString}) 

przykład oparty na pytanie:

String args = TextUtils.join(", ", ids); 
db.delete("rows","id IN (?)", new String[]{args}) 
5

Android Oficjalna dokumentacja mówi here że używanie execSQL nie jest właściwym sposobem usuwania rekordów.

Chciałbym zasugerować następującą prostą metodę. Korzystanie z podanego delete() api.

String[] idArray = new String[] {"1", "2", "3"}; 
String idsCSV = TextUtils.join(",", idArray); 
SQLiteDatabase db = getWritableDatabase(); 
if (db != null) { 
    db.delete("table_name", "id IN (" + idsCSV + ")", null); 
    db.close(); 
} 
Powiązane problemy