2011-09-08 5 views
7

Android 앱에 대한 단위 테스트를 진행 중이며 주소록을 많이 사용하고 있습니다. Android Content Providers에 연락처를 삽입하고 테스트를 실행 한 후 삭제해야합니다. 문제는 실제로 삭제되지 않습니다이다 :Android 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과 동일하지만 다른 방법) :

연락처 삭제 방법은 작동하지만 원시 연락처 삭제 방법은 잘못된 값을 반환합니다. 모든 대화 상대를 삭제했다는 것을 알려주지 만 다음 테스트 사례를 실행하면 이전의 원시 주소록을 계속 찾을 수 있습니다 (예 : 삽입 된 주소록과 현재 주소록이 잘못됨). 참고 : 모든 테스트는 Android 에뮬레이터에서 수행됩니다.

어떻게 해결할 수 있습니까?

나는 비슷한 질문을 여기에서 보았습니다 : How to delete a contact? - 그러나 해결책은 주어진 문제를 해결하지 못합니다.

답변

19

는 1

당신이해야 할 것은이 같은 사실에 URI에서 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이다 (O perations-> delete). :)

+0

L0rdAli3n 코딩

이 도움이 희망과 행복, 당신은 단지 위기의 남자 : –

+0

을 돕는 좋은 업보를 취득 나는 나는이 대답을 표시하는 것을 잊었다 :) –

+0

난 그냥 실현 도울 수 기뻐요 올바른 것 - 크리스토프 하프너 (Christophe Haefner)보다 늦은 것이 더 낫습니다. – benfwirtz

0

동일한 issue.I에서 일하고 있습니다. 삭제 된 열이 1로 설정되면 삭제됩니다. contentresolver가 물리적으로 rawcontact 데이터를 삭제하지 않는다고 생각합니다. 삭제 플래그를 설정해야합니다. 이 태그. wiseideal 이미 만 설정됩니다 rawcontacts을 삭제하는 방법을 언급 한 바와 같이