Odpowiedz

9

Błąd pojawia się, ponieważ w miejscu, w którym znajduje się klauzula, znajduje się jeden symbol zastępczy (?), Podczas gdy przekazuje się trzy argumenty. należy zrobić:

String ids = { "1", "2", "3" }; 

mContentResolver.delete(uri, MyTables._ID + "=? OR " + MyTables._ID + "=? OR " + MyTables._ID + "=?", ids); 

ja nie wiem, czy SQLite obsługuje klauzula, jeśli tak można też zrobić:

String ids = { "1, 2, 3" }; 

mContentResolver.delete(uri, MyTables._ID + " IN (?)", ids); 
+0

Dzięki Jan. Chyba miał fundamentalne niezrozumienie jak selectionArgs pracował. Moje identyfikatory mogą mieć zmienny rozmiar. Twoje drugie rozwiązanie wygląda atrakcyjniej. Obawiam się jednak, że to też nie działa. Przypuszczam, że mógłbym tylko sprawdzić mój rozmiar i pętlę, aby skonstruować, że tam, gdzie clase, ale to nie wydaje się ładne :( –

19

Można użyć ContentProviderOperation do usunięcia partii/wkładania/aktualizację w jednej transakcji . To o wiele ładniejsze, że nie musisz łączyć łańcuchów. Powinien też być bardzo wydajny. Do usunięcia:

ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); 
    ContentProviderOperation operation; 

    for (Item item : items) { 

     operation = ContentProviderOperation 
       .newDelete(ItemsColumns.CONTENT_URI) 
       .withSelection(ItemsColumns.UID + " = ?", new String[]{item.getUid()}) 
       .build(); 

     operations.add(operation); 
    } 

    try { 
     contentResolver.applyBatch(Contract.AUTHORITY, operations); 
    } catch (RemoteException e) { 

    } catch (OperationApplicationException e) { 

    } 
+0

Prawidłowo, mam to zapytanie, czy 'BulkInsert' jest szybszy, że' ApplyBatch' – Anuj

+0

dla operacji sms Urząd to '" sms "' –

+0

dla operacji na piosence, AUTORYZOWANY identyfikator 'MediaStore.AUTHORITY' –

0
String sqlCommand = String.format("DELETE FROM %s WHERE %s IN (%s);", TABLE_NAME, KEY_ID, 1,2,3); 

db.execSQL(sqlCommand);