8

Sto tentando di eliminare in batch alcuni elementi in una tabella.Batch Elimina elementi con Content Provider in Android

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

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

Tuttavia continuo a ricevere questo errore seguente

java.lang.IllegalArgumentException: Troppi argomenti legano. Sono stati forniti 3 argomenti ma l'istruzione richiede 1 argomento.

risposta

9

L'errore si verifica perché si dispone di un singolo segnaposto (?) Nella clausola where, mentre si passano tre argomenti. Si dovrebbe fare:

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

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

Non so se SQLite supporta la clausola, se così si potrebbe anche fare:

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

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

Grazie gennaio credo che ho avuto un fraintendimento fondamentale di come i selectionArgs lavorato. I miei ID possono essere di dimensioni variabili. Quindi la tua seconda soluzione sembra più attraente. Tuttavia, temo che neanche sembra che funzioni. Suppongo che potrei controllare la mia dimensione e il ciclo per costruire quello dove clase, ma che non sembra bello :( –

19

È possibile utilizzare ContentProviderOperation per lotti delezione/inserzione/aggiornamento in una transazione . È molto più bello non dover concatenare le stringhe. Dovrebbe anche essere molto efficiente. Per l'eliminazione:

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

corretto, ho questa query se 'BulkInsert' è più veloce che' ApplyBatch' – Anuj

+0

per l'operazione sms dell'Autorità è '" sms "' –

+0

per l'operazione canzone, l'ID AUTORITÀ 'MediaStore.AUTHORITY' –

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

db.execSQL(sqlCommand);