2011-08-19 12 views
6

में कई संपर्कों को जोड़ें मैं पूरी तरह से संपर्क निम्न कोड के साथ एक के बाद एक जोड़ने के लिए सक्षम हूँ:बैच

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

हालांकि, जब मैं एक के बाद के बारे में 500 संपर्कों को एक जोड़ने की कोशिश - यह कुछ ही मिनट लगते है, जो मेरे ऐप के लिए बहुत लंबा क्या कई संपर्क जोड़ने का कोई तेज़ तरीका है?

+1

आप उन्हें थ्रेड में जोड़ सकते हैं - यूआई थ्रेड नहीं। – Phil

+0

मैं इसे अलग थ्रेड में करता हूं, समस्या यह है कि ऑपरेशन में बहुत अधिक समय लगता है। आईफोन में 500 संपर्कों के लिए कुछ सेकंड लगते हैं। – lstipakov

+0

मैं इसे इसी तरह से करता हूं, हालांकि मैं हर बार बैच करता हूं जब मैं एक संपर्क जोड़ना चाहता हूं। मुझे नहीं लगता कि यह सही तरीका है, लेकिन ऐसा लगता है कि –

उत्तर

0

क्यों सरलीसूची को ग्लोबल नहीं बनाया जाता है जिसे किसी भी गतिविधि से एक्सेस किया जा सकता है, जिसे मैं एक बंडल में इतना अधिक नहीं डालता क्योंकि आप करते समय और अधिक चलते हैं, यह केवल छोटी मात्रा में जानकारी पास करने के लिए होता था। मैं इसे इस तरह करना होगा .. भी प्रकट में इस कॉल करने के लिए सुनिश्चित करने के,

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

यह कैसे संबंधित है मेरे प्रश्न के लिए? – lstipakov

+0

यह बंडल का उपयोग करने के बजाय एक वैश्विक उत्तर है जो आप एक वैश्विक सरणी बनाते हैं जो सभी गतिविधियों के लिए सुलभ है। – JPM

+0

मुझे गतिविधियों के बीच डेटा पास करने में कोई समस्या नहीं है। मुझे धीमी संपर्क API के साथ समस्या है। – lstipakov

0

आप एक ही समारोह आप छोटे संशोधन करने से एक भी बैच आपरेशन में एक से अधिक संपर्क जोड़ने के लिए उपयोग कर रहे हैं का उपयोग कर सकते हैं।

आप एक बैच ऑपरेशन में 500 ऑपरेशन जोड़ सकते हैं, आप कच्चे_कंटैक्ट्स सम्मिलन ऑपरेशन के संबंधित इंडेक्स के साथ डेटा यूरी ऑपरेशन में बैक-रेफरेंस को शामिल रख सकते हैं।

+1

क्या आप इस उत्तर पर विस्तार कर सकते हैं, क्या छोटे संशोधन? मुझे एक समान समस्या है, हालांकि कोड के माध्यम से लूपिंग कारण (अज्ञात) संपर्क जोड़े जा रहा है। [कड़ी] (http://stackoverflow.com/questions/11886900/inserting-multiple-contacts-in-android-2-3-5) –