2017-02-01 1 views
2

전화 연락처에서 연락처를 삭제하려고합니다. 연락처가 전화 연락처에서 삭제되지만 서버 측 (Google 연락처)에서 삭제되지 않으며 Google 연락처 동기화가 트리거되면 삭제 된 연락처가 다시 ​​표시됩니다. 아래는 제 코드입니다.안드로이드 연락처에서 연락처 삭제

public static void deleteContact(long rawid, ContentResolver contentResolver) { 
    ArrayList<ContentProviderOperation> ops = new ArrayList<>(); 
    Uri uri = ContactsContract.RawContacts.CONTENT_URI 
      .buildUpon() 
      .appendQueryParameter(
        ContactsContract.CALLER_IS_SYNCADAPTER, 
        "true") 
      .build(); 
    ops.add(ContentProviderOperation 
      .newDelete(uri) 
      .withSelection(
        ContactsContract.RawContacts._ID + " = ?", 
        new String[]{Long.toString(rawid)}) 
      .build()); 

    try { 
     contentResolver.applyBatch(
       ContactsContract.AUTHORITY, 
       ops); 
    } catch (RemoteException | OperationApplicationException e) { 
     e.printStackTrace(); 
    } 
} 
+0

당신의 코드는 모바일의 연락처 DB에서 연락처를 제거 몇 년이며, 분이 다시 나타납니다. –

+0

그러면 연락처를 영구적으로 삭제하는 방법은 무엇입니까? – MaxTycoon

답변

1

당신은 당신의 코드에서 falseContactsContract.CALLER_IS_SYNCADAPTER으로 시도해야합니다. true로 설정되어 있으면 연락처가 데이터베이스에서 영구적으로 삭제됩니다. 그러나 다음 동기화가 발생하면 연락처가 다시 ​​동기화됩니다. Google에서 삭제 된 주소록을 확인하는 방법은 ContactsContract.CALLER_IS_SYNCADAPTERfalse으로 설정 한 경우에만 삭제 된 깃발을 사용하고 있습니다. 모바일 활성 구글 계정의 동기화가있는 경우 아래 (연락처 데이터 저장소에 대한 컨텐트 프로) 상기 ContactsProvider 클래스의 코드 조각

if (callerIsSyncAdapter || rawContactIsLocal(rawContactId)) { 
    // When a raw contact is deleted, a SQLite trigger deletes the parent contact. 
    // TODO: all contact deletes was consolidated into ContactTableUtil but this one can't 
    // because it's in a trigger. Consider removing trigger and replacing with java code. 
    // This has to happen before the raw contact is deleted since it relies on the number 
    // of raw contacts. 
    db.delete(Tables.PRESENCE, PresenceColumns.RAW_CONTACT_ID + "=" + rawContactId, null); 
    count = db.delete(Tables.RAW_CONTACTS, RawContacts._ID + "=" + rawContactId, null); 
    mTransactionContext.get().markRawContactChangedOrDeletedOrInserted(rawContactId); 
} else { 
    count = markRawContactAsDeleted(db, rawContactId, callerIsSyncAdapter); 
} 
관련 문제