2011-08-19 16 views
6

jestem w stanie doskonale dodać kontakty jeden po drugim z następującego kodu:Dodaj kilka kontaktów w partii

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

Jednak gdy próbuję dodać około 500 kontakty jeden po drugim - to trwa kilka minut, co jest za długo na moją aplikację. Czy jest jakikolwiek szybszy sposób dodania kilku kontaktów?

+1

Można dodać je w wątku, a nie w wątku interfejsu użytkownika. – Phil

+0

Robię to w osobnym wątku, problemem jest to, że sama operacja zajmuje zbyt dużo czasu. W przypadku iPhone'a potrzeba kilku sekund na 500 kontaktów. – lstipakov

+0

Robię to w podobny sposób, ale robię partie za każdym razem, gdy chcę dodać kontakt. Nie wydaje mi się, żeby to była właściwa droga, ale wygląda na to, że działa dobrze –

Odpowiedz

0

Dlaczego nie sprawić, by lista tablic była globalna, do której można uzyskać dostęp z dowolnej aktywności, której nie włożyłbym do Pakietu, ponieważ dzieje się tam więcej, gdy trzeba było przekazywać tylko małe kwoty. Chciałbym zrobić to w ten sposób, upewniając się, że nazywają to w manifeście zbyt ..

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

Jak to jest powiązane na moje pytanie? – lstipakov

+0

Jest to uzasadniona odpowiedź, zamiast używać zestawu do przekazywania ogromnych ilości danych, tworząc globalną tablicę dostępną dla wszystkich działań. – JPM

+0

Nie mam problemu z przekazywaniem danych między działaniami. Mam problem z wolnym interfejsem API Kontaktów. – lstipakov

0

można wykorzystywać tę samą funkcję, którego używasz, aby dodać wiele kontaktów w jednej operacji wsadowych, dokonując niewielkich zmian.

Możesz dodać do 500 operacji do pojedynczej operacji wsadowej, możesz nadal włączać odniesienie do tyłu w operacji Data Uri z odpowiednim indeksem operacji wstawiania raw_contacts.

+1

Czy możesz rozwinąć tę odpowiedź, jakie małe modyfikacje? Mam podobny problem, jednak przepuszczanie kodu wydaje się powodować dodawanie (nieznanych) kontaktów. [link] (http://stackoverflow.com/questions/11886900/inserting-multiple-contacts-in-android-2-3-5) –

Powiązane problemy