2011-08-19 19 views
6

Soy perfectamente capaz de agregar los contactos uno a uno con el siguiente código:Añadir varios contactos en lotes

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(); 
    } 

Sin embargo, cuando intento agregar alrededor de 500 contactos uno a uno - se tarda unos pocos minutos, lo que es demasiado tiempo para mi aplicación. ¿Hay alguna forma más rápida de agregar varios contactos?

+1

Puede agregarlos en un subproceso, no en el subproceso UI. – Phil

+0

Lo hago en un hilo separado, el problema es que la operación en sí toma demasiado tiempo. En iPhone, toma unos segundos para 500 contactos. – lstipakov

+0

Lo hago de manera similar, pero hago los lotes cada vez que quiero agregar un contacto. No creo que sea la manera correcta, pero parece funcionar bien –

Respuesta

0

¿Por qué no hacer que el arraylist sea global al que se puede acceder desde cualquier actividad? No insertaría tanto en un Bundle ya que hay más cosas que hacer cuando lo haga, solo tenía que pasar información de cantidades pequeñas. Me gustaría hacerlo de esta manera, asegurándose de llamar a esto en el manifiesto también ..

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

Cómo esto está relacionado a mi pregunta? – lstipakov

+0

Es una respuesta legítima en lugar de utilizar el paquete para pasar enormes cantidades de datos que crea una matriz global que es accesible para todas las actividades. – JPM

+0

No tengo problemas para pasar datos entre actividades. Tengo un problema con la API lenta de Contactos. – lstipakov

0

Usted puede utilizar la misma función que está utilizando para agregar varios contactos en una sola operación por lotes haciendo pequeñas modificaciones.

Puede agregar hasta 500 operaciones a una sola operación por lotes, puede seguir incluyendo la referencia posterior en la operación Data Uri con el índice correspondiente de la operación de inserción de raw_contacts.

+1

¿Podría ampliar esta respuesta, qué pequeñas modificaciones? Tengo un problema similar, sin embargo, al pasar por el código parece que se agregan contactos (desconocidos). [enlace] (http://stackoverflow.com/questions/11886900/inserting-multiple-contacts-in-android-2-3-5) –

Cuestiones relacionadas