성명으로 검색한 연락처(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());
} }); |