2011-09-08 14 views
7

में हटाना (कच्चे) संपर्क मैं अपने एंड्रॉइड ऐप के लिए यूनिट टेस्ट पर काम कर रहा हूं, और संपर्कों के साथ बहुत कुछ कर रहा हूं। मुझे एंड्रॉइड सामग्री प्रदाता में संपर्क सम्मिलित करना होगा, और मेरे परीक्षण चलाने के बाद उन्हें हटा देना होगा। मुसीबत है, वे वास्तव में हटा दिया जाता है नहीं है:एंड्रॉइड 2.x

प्रविष्टि:

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

int backRefIndex = 0; 

Random r = new Random(); 

    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
              .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null) 
              .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null) 
              .build());  
    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
              .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) 
              .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE) 
              .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, "Sample Name" + r.nextInt()) 
              .build()); 

    contactOps.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, backRefIndex) 
         .withValue(ContactsContract.CommonDataKinds.Phone.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE) 
         .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, "020" + r.nextInt()) 
         .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, r.nextInt(20) 
         .build()); 

    try { 
     ContentProviderResult[] result = context.getContentResolver().applyBatch(ContactsContract.AUTHORITY, contactOps); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

हटाने की विधि 1 (कच्चे संपर्कों की संख्या देता है, लेकिन वे वास्तव में हटा दिया जाता है नहीं है):

int deletedRawContacts = context.getContentResolver().delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

हटाना विधि 2 (हटाए गए विधि 1 के समान परिणाम, लेकिन अलग दृष्टिकोण):

private static int deleteAllRawContacts(Context context) { 
    ContentResolver cr = context.getContentResolver(); 
    Cursor cur = cr.query(ContactsContract.RawContacts.CONTENT_URI, null, null, null, null); 
    int count = 0; 
    while (cur.moveToNext()) { 
     try { 
      String contactId = cur.getString(cur.getColumnIndex(ContactsContract.RawContacts._ID)); 
       count += cr.delete(ContactsContract.RawContacts.CONTENT_URI, ContactsContract.RawContacts._ID + " = ?", new String[]{contactId}); 
     } catch (Exception e) { 
      System.out.println(e.getStackTrace()); 
     } 
    } 
    return count; 
} 

संपर्कों के लिए विलोपन विधि काम करता है, लेकिन कच्चे संपर्कों के लिए हटाने विधि एक गलत मान लौटाएगी। यह मुझे "बताएगा", कि उसने सभी संपर्क हटा दिए, लेकिन जब मैं अपना अगला टेस्ट केस चलाता हूं, तो पुराने कच्चे संपर्क अभी भी मिल सकते हैं (यानी सम्मिलित संपर्क बनाम मौजूदा संपर्कों की गिनती गलत है)। नोट: एंड्रॉइड एमुलेटर पर सभी परीक्षण किए जाते हैं।

कोई विचार यह कैसे हल करें?

मैंने यहां एक समान प्रश्न देखा: How to delete a contact? - लेकिन समाधान किसी भी समस्या को हल करने के लिए प्रतीत नहीं होता है।

उत्तर

19

wiseideal पहले से ही जिस तरह से आप अपने rawcontacts हटाना ही सेट हो जाएगा उल्लेख किया है 1.

आपको क्या करने की जरूरत है इस तरह सच करने के लिए अपने यूआरआई में caller_is_syncadapter-ध्वज सेट करने के लिए है करने के लिए -flag "हटाए गए":

RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build() 

और फिर हटाएं-विधि कॉल करने के लिए इस नए URI का प्रयोग:

int deletedRawContacts = context.getContentResolver().delete(RawContacts.CONTENT_URI.buildUpon().appendQueryParameter(ContactsContract.CALLER_IS_SYNCADAPTER, "true").build(), ContactsContract.RawContacts._ID + " >= ?", new String[]{"0"}); 

दस्तावेज में इसी भाग here (है हे perations-> हटाना)।

आशा इस मदद करता है और खुश कोडन :)

+0

L0rdAli3n, तो आप सिर्फ एक हताश आदमी :) –

+0

की मदद करने के लिए कुछ अच्छे कर्म अर्जित मुझे खुशी है कि मैं मदद कर सकता है :) –

+0

मैं सिर्फ महसूस किया कि मैं इस उत्तर को चिह्नित करना भूल गया हूँ सही के रूप में - कभी भी @ क्रिस्टोफ हेफेनर की तुलना में बेहतर देर हो चुकी है? – benfwirtz

0

मैं एक ही मुद्दे पर काम कर रहा हूं। मुझे पता चला कि डिलीट कॉलम 1 को "हटाए जाने के बाद 1 पर सेट किया गया है। इसलिए मुझे लगता है कि कंटेंटसेल्वर शारीरिक रूप से कच्चे संपर्क डेटा को हटा नहीं देता है, यह सिर्फ एक डिलीट फ्लैग सेट करता है। शायद हमें टालना चाहिए ये टैग

संबंधित मुद्दे