728x90

성명 + 전화번호 기준으로 일치되는 데이터를 삭제하는 메소드 구현을 적어둔다.

좀 더 나은 방법을 구현하면 업데이트해서 수정할 생각이다.


수정 구현 사항

// 성명 + 휴대폰번호 기준으로 연락처 삭제 (동명이인 고려)
public static void deleteContactFromNameAndNumber(ContentResolver contactHelper, String display_name, String number) {
    // 로직 개념 : 이름 검색으로 전화번호를 구한 다음에, 전화번호 일치여부 확인후 삭제 순서로 로직 구현
    number = number.replaceAll("[^0-9]", ""); // 숫자만 추출
    Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = {Phone.CONTACT_ID, Phone.NUMBER};
    String where = Phone.DISPLAY_NAME + " = '" + display_name + "' AND " + Phone.TYPE + "=2";
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
    Cursor cursor = null;
    try {
        if (display_name != null && !display_name.equals("") && number != null && !number.equals("")) {
            cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
            if (cursor.moveToFirst()) {
                do {
                    String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                    phoneNO = phoneNO.replaceAll("[^0-9]", ""); // 숫자만 추출
                    if (number.equals(phoneNO)) {
                        // 이름으로 찾은 전화번호와 입력된 전화번호가 서로 같으면 해당 연락처 삭제 처리
                        long rawContactId = cursor.getLong(cursor.getColumnIndex(Phone.CONTACT_ID));
                        contactHelper.delete(RawContacts.CONTENT_URI,RawContacts.CONTACT_ID + "=" + rawContactId,null);
                    }
                } while (cursor.moveToNext());
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(cursor != null) {
            cursor.close();
        }
    }
}



기존 구현 사항

public class ContactHelper {
    public ContactHelper() {
    }

    // 전화번호에서 ContactID 획득
    private static long getContactIDFromNumber(ContentResolver contactHelper, String number) {
        long rawContactID = -1;
        number = number.replaceAll("[^0-9]", ""); // 숫자만 추출
        Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        String[] projection = { PhoneLookup._ID };
        Cursor cursor = null;

        try {
            cursor = contactHelper.query(contactUri, projection, null, null, null);
            if (cursor.moveToFirst()) {
                rawContactID = cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            cursor.close();
        }
        return rawContactID;
    }

    // 전화번호 기준으로 연락처 삭제
    public static void deleteContactFromNumber(ContentResolver contactHelper, String number) {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        String[] WhereArgs = new String[] { String.valueOf(getContactIDFromNumber(contactHelper, number)) };

        ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
                .withSelection(RawContacts.CONTACT_ID + "=?", WhereArgs).build());
        try {
            contactHelper.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            e.printStackTrace();
        }
    }

    // 성명 + 전화번호 기준으로 연락처 삭제 (동명이인 고려)
    public static void deleteContactFromNameAndNumber(ContentResolver contactHelper, String display_name, String number) {
        // 로직 개념 : 이름 검색 --> 전화번호 --> ContactID 를 구하는 순서로 로직 구현
        number = number.replaceAll("[^0-9]", ""); // 숫자만 추출
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = { ContactsContract.CommonDataKinds.Phone.NUMBER };
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " = '" + display_name + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;
        try {
            if (display_name != null && !display_name.equals("") && number != null && !number.equals("")) {
                cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
                if (cursor.moveToFirst()) {
                    do {
                        String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                        phoneNO = phoneNO.replaceAll("[^0-9]", ""); // 숫자만 추출
                        if (number.equals(phoneNO)) {
                            // 이름으로 찾은 전화번호와 입력된 전화번호가 서로 같으면 해당 연락처 삭제 처리
                            deleteContactFromNumber(contactHelper, phoneNO);
                        }
                    } while (cursor.moveToNext());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}



블로그 이미지

Link2Me

,
728x90

성명으로 검색한 연락처(Contacts)를 모두 삭제하는 메소드 구현사항을 적어둔다.

좀 더 효율적인 방법을 찾기 위해서 지속 수정 테스트로 내용 변경이 발생하다보니 기존 구현 메소드도 필요할 때가 있을거 같아서 적어둔다.


삭제 기본지식 이해

연락처를 읽거나 쓰기(수정/삭제) 위해서는 아래와 같은 퍼미션이 필요하다.
<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>


연락처 삭제 메소드 중의 하나
static public void deleteContact(Context context, long rawContactId) {
  context.getContentResolver().delete(RawContacts.CONTENT_URI, RawContacts.CONTACT_ID + " = " + rawContactId, null);
}


RawContacts 를 삭제하면 종속된 data 는 자동으로 삭제가 된다.
Contacts 를 지우면 종속된 RawContacts 를 자동으로 삭제한다.
ContactsProvider 를 이용해서 RawContacts 를 삭제하면 데이터베이스에서 바로 지워지지 않는다.
RawContacts 테이블의 deleted 필드를 1로 세팅한다.
그리고 SyncAdapter 에 의해 실제 삭제가 이루어진다. 


성명(display_name)으로 검색한 동일한 이름을 포함하는 모든 데이터는 삭제를 한다.


수정 구현 사항

// 성명 포함 연락처 삭제 (구현 완료)
public static void deleteContactFromNameLIKE(ContentResolver contactHelper, String display_name) {
    System.out.println("Contact Name Search : " + display_name);
    Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
    String[] projection = {Phone.CONTACT_ID, Phone.NUMBER}; // 검색
    String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like \'%" + display_name + "%\'";
    String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
    Cursor cursor = null;
    try {
        if (display_name != null && !display_name.equals("")) {
            cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
            if (cursor.moveToFirst()) {
                int count = 0;
                do {
                    long rawContactId = cursor.getLong(cursor.getColumnIndex(Phone.CONTACT_ID));
                    contactHelper.delete(RawContacts.CONTENT_URI,RawContacts.CONTACT_ID + "=" + rawContactId,null);
                    count++;
                } while (cursor.moveToNext());
                System.out.println("Delete Contact Number Count = " + count);
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if(cursor != null) {
            cursor.close();
        }
    }
}



기존 구현 사항

public class ContactHelper {
    public ContactHelper() {
    }

    // 성명 포함 연락처 삭제
    public static void deleteContactFromNameLIKE(ContentResolver contactHelper, Context context, String display_name) {
        System.out.println("Contact Name Search : " + display_name);
        Uri contactUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] projection = { ContactsContract.CommonDataKinds.Phone.NUMBER };
        String where = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like \'%" + display_name + "%\'";
        String sortOrder = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC";
        Cursor cursor = null;
        try {
            if (display_name != null && !display_name.equals("")) {
                cursor = contactHelper.query(contactUri, projection, where, null, sortOrder);
                if (cursor.moveToFirst()) {
                    int count = 0;
                    do {
                        String phoneNO = cursor.getString(cursor.getColumnIndex(Phone.NUMBER));
                        deleteContactFromNumber(contactHelper, phoneNO);
                        count++;
                    } while (cursor.moveToNext());
                    System.out.println("Delete Contact Number Count = " + count);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void deleteContactFromNumber(ContentResolver contactHelper, String number) {

        ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
        String[] WhereArgs = new String[] { String.valueOf(getContactIDFromNumber(contactHelper, number)) };

        ops.add(ContentProviderOperation.newDelete(RawContacts.CONTENT_URI)
                .withSelection(RawContacts.CONTACT_ID + "=?", WhereArgs).build());
        try {
            contactHelper.applyBatch(ContactsContract.AUTHORITY, ops);
        } catch (RemoteException e) {
            e.printStackTrace();
        } catch (OperationApplicationException e) {
            e.printStackTrace();
        }
    }

    // 전화번호에서 ContactID 획득
    private static long getContactIDFromNumber(ContentResolver contactHelper, String number) {
        long rawContactID = -1;
        number = number.replaceAll("[^0-9]", ""); // 숫자만 추출
        Uri contactUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

        String[] projection = { PhoneLookup._ID };
        Cursor cursor = null;

        try {
            cursor = contactHelper.query(contactUri, projection, null, null, null);
            if (cursor.moveToFirst()) {
                System.out.println("ContactID from number : " + cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID)));
                rawContactID = cursor.getLong(cursor.getColumnIndex(PhoneLookup._ID));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
                cursor.close();
        }

        return rawContactID;
    }
}


사용법

btn_delte.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {

        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                // 전화번호 삭제
                ContactHelper.deleteContactFromNameLIKE(getContentResolver(), MainActivity.this, "홍길동");
            }
        });

        // 현재 Activity 갱신처리
        finish();
        startActivity(getIntent());

    }
});



블로그 이미지

Link2Me

,