8

Bir tablodaki bazı öğeleri toplu olarak silmeye çalışıyorum. Çok fazla bağlama argümanlar: Batch Android'de İçerik Sağlayıcı ile öğeleri sil

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

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

Ancak bu şu hatayı

java.lang.IllegalArgumentException almaya devam. 3 argüman verilmiştir, ancak ifadenin 1 argümanına ihtiyacı vardır.

cevap

9

Hata, üç bağımsız değişkeni geçerken, nerede bulunduğunuz yerde tek bir yer tutucunuz (?) Bulunduğundan oluşur. Sen yapmalıdır:

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

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

SQLite IN yan tümcesi destekliyorsa da yapabilirdi eğer öyleyse ben bilmiyorum:

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

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

Teşekkür Ocak Ben selectionArgs nasıl çalıştığını temel bir anlaşmazlık oldu sanırım. Kimliklerim boyut olarak değişebilir. Yani ikinci çözümün daha çekici görünüyor. Ancak, korkarım ki bu da işe yaramıyor. Sadece boyutumu kontrol edebilirim ve ilmek yaptığım yerde görünmez, ama bu hoş görünmüyor :( –

19

tek bir işlemde toplu silme/ekleme/güncelleme için ContentProviderOperation kullanabilirsiniz . Dizeleri birleştirmek zorunda kalmaman çok daha güzel. Aynı zamanda çok verimli olmalı. silinmesi için:

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

Doğru, Bu sorgun var, "BulkInsert" daha hızlıdır, "ApplyBatch" – Anuj

+0

otorite için şarkı işlemi için "sms" –

+0

, AUTHORITY 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);