2011-08-19 15 views
6

Sono perfettamente in grado di aggiungere contatti uno ad uno con seguente codice:Aggiungere diversi contatti in lotti

ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build()); 

    ops.add(ContentProviderOperation 
      .newInsert(Data.CONTENT_URI) 
      .withValueBackReference(Data.RAW_CONTACT_ID, 0) 
      .withValue(Data.MIMETYPE, 
        CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
        .withValue(StructuredName.GIVEN_NAME, "Hello") 
        .withValue(StructuredName.FAMILY_NAME, "World").build()); 

    try { 
     getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops); 
    } catch (RemoteException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (OperationApplicationException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Tuttavia, quando provo ad aggiungere circa 500 contatti uno per uno - ci vogliono pochi minuti, che è troppo lungo per la mia app. È il modo più veloce per aggiungere più contatti?

+1

È possibile aggiungerli in un thread, non nel thread dell'interfaccia utente. – Phil

+0

Lo faccio in thread separati, il problema è che l'operazione stessa richiede troppo tempo. In iPhone ci vogliono pochi secondi per 500 contatti. – lstipakov

+0

Lo faccio in un modo simile, tuttavia faccio i batch per ogni volta che voglio aggiungere un contatto. Non penso che sia la strada giusta, ma sembra funzionare bene –

risposta

0

Perché non rendere l'arraylist un globale a cui è possibile accedere da qualsiasi attività non lo inserirò più di tanto in un bundle, come succede di più quando lo si fa, ma solo per trasmettere piccole informazioni. Vorrei fare in questo modo, facendo attenzione a chiamare questo nel manifesto troppo ..

public class MyStates extends Application { 

    private ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>(); 

    public ArrayList getList() { 
    return this.blueToothAdapter; 
    } 

    public void setList(ArrayList<ContentProviderOperation> o) { 
     this.ops= o; 
    } 
+0

Come questo è collegato alla mia domanda? – lstipakov

+0

È una risposta legittima invece di utilizzare il pacchetto per passare enormi quantità di dati e creare un array globale accessibile a tutte le attività. – JPM

+0

Non ho problemi nel trasferire i dati tra le attività. Ho un problema con l'API Contatti lenta. – lstipakov

0

È possibile utilizzare la stessa funzione che si utilizza per aggiungere più contatti in una sola operazione in batch, facendo piccole modifiche.

È possibile aggiungere fino a 500 operazioni a un'operazione di singolo batch, è possibile continuare a includere il riferimento di ritorno nell'operazione Data Uri con l'indice corrispondente dell'operazione di inserimento raw_contacts.

+1

Potresti espandere questa risposta, quali piccole modifiche? Sto avendo un problema simile, tuttavia il looping del codice sembra causare l'aggiunta di contatti (sconosciuti). [Link] (http://stackoverflow.com/questions/11886900/inserting-multiple-contacts-in-android-2-3-5) –

Problemi correlati