8

Estoy tratando de eliminar por lotes algunos elementos en una tabla.Lote Eliminar elementos con Proveedor de contenido en Android

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

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

Sin embargo sigo recibiendo este error siguiente

java.lang.IllegalArgumentException: Demasiados argumentos de vinculación. Se proporcionaron 3 argumentos, pero la afirmación necesita 1 argumento.

Respuesta

9

El error se produce porque tiene un único marcador de posición (?) En su cláusula where, mientras pasa tres argumentos. Que debe hacer:

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

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

No sé si SQLite apoya la cláusula IN, si por lo que también podría hacer:

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

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

Gracias Jan. supongo que tenía un malentendido fundamental de cómo funcionaba el selectionArgs. Mis identificaciones pueden ser de tamaño variable. Entonces, su segunda solución parece más atractiva. Sin embargo, me temo que tampoco parece funcionar. Supongo que podría simplemente verificar mi tamaño y bucle para construir eso donde clase, pero eso no parece agradable :( –

19

Puede utilizar ContentProviderOperation para el lote deleción/inserción/actualización en una transacción . Es mucho mejor que no tengas que concatenar cadenas. También debería ser muy eficiente. Para su eliminación:

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

Correcto, tengo esta consulta si 'BulkInsert' es más rápido que' ApplyBatch' – Anuj

+0

para la operación de sms de la Autoridad es '" sms "' –

+0

para la operación de la canción, la AUTORIDAD id 'MediaStore.AUTHORITY' –

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

db.execSQL(sqlCommand); 
Cuestiones relacionadas