2011-09-08 32 views
7

Tôi đang làm việc trên Bài kiểm tra đơn vị cho ứng dụng Android của mình và đang làm rất nhiều việc với Danh sách liên hệ. Tôi phải chèn liên hệ vào Nhà cung cấp nội dung Android và xóa chúng sau khi chạy thử nghiệm của mình. Vấn đề là, họ không được thực sự bị xóa:Xóa (Địa chỉ liên hệ thô) trong Android 2.x

Insertion:

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

phương pháp xóa 1 (trả về số danh bạ liệu, nhưng họ không thực sự được xóa):

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

Phương pháp xóa 2 (cùng một kết quả như phương pháp xóa 1, nhưng cách tiếp cận khác):

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

Phương thức xóa cho Danh bạ hoạt động, nhưng phương pháp xóa cho Liên hệ thô sẽ trả về giá trị sai. Nó sẽ "thông báo" cho tôi, rằng nó đã xóa tất cả các liên hệ, nhưng khi tôi chạy trường hợp thử nghiệm tiếp theo, vẫn có thể tìm thấy Danh sách liên hệ thô cũ (nghĩa là số lượng địa chỉ liên hệ được chèn so với địa chỉ liên hệ hiện tại không đúng). Lưu ý: Tất cả thử nghiệm được thực hiện trên trình giả lập Android.

Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?

Tôi thấy một câu hỏi tương tự ở đây: How to delete a contact? - nhưng giải pháp dường như không giải quyết được vấn đề nhất định.

Trả lời

19

Như wiseideal đã được đề cập theo cách bạn xóa rawcontacts của bạn sẽ chỉ đặt "xóa" -flag để 1.

Những gì bạn cần làm là để thiết lập caller_is_syncadapter-cờ trong URI của bạn để đúng như thế này:

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

Và sau đó sử dụng URI mới này để gọi delete-phương pháp:

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

các phần tương ứng trong tài liệu là here (O perations-> delete).

Hope this helps và hạnh phúc mã hóa :)

+0

L0rdAli3n, bạn chỉ cần kiếm được một số nghiệp tốt để giúp một người đàn ông tuyệt vọng :) –

+0

Tôi rất vui vì tôi có thể giúp :) –

+0

Tôi chỉ nhận ra tôi quên để đánh dấu câu trả lời này đúng - muộn hơn không bao giờ @ChristophHaefner? – benfwirtz

0

Tôi đang làm việc trên cùng một vấn đề. Tôi thấy cột xóa được đặt thành 1 khi tôi "xóa". Do đó, tôi nghĩ contentresolver không xóa dữ liệu rawcontact về mặt vật lý, nó chỉ đặt cờ xóa. Có thể chúng ta nên tránh các thẻ này.

Các vấn đề liên quan