Search code examples
javaandroidcursorandroid-contacts

How To Remove Unique Values From a Cursor


Im working on a Application where im only supposed to display duplicate phone contacts to the user so they can delete the duplicates. Duplicates

So far im able to display all contacts using the following code:

Main Activity:

private void showContacts() {
Cursor cursor = ContactHelper.getContactCursor(getContentResolver(),"");
String[] fields = new String[]{ContactsContract.Data.DISPLAY_NAME};

adapter =new SimpleCursorAdapter(this,android.R.layout.simple_list_item_multiple_choice,cursor,fields,new  int[]{android.R.id.text1});
listView.setAdapter(adapter);
adapter.notifyDataSetChanged(); }

ContactHelper.GetContactsCursor function:

public static Cursor getContactCursor(ContentResolver contactHelper,
                                      String startsWith) {

    String[] projection = { ContactsContract.CommonDataKinds.Phone._ID,
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER };
    Cursor cur = null;

    try {
        if (startsWith != null && !startsWith.equals("")) {
            cur = contactHelper.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    projection,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                            + " like \"" + startsWith + "%\"", null,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                            + " ASC");
        } else {
            cur = contactHelper.query(
                    ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                    projection, null, null,
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                            + " ASC");
        }
        cur.moveToFirst();
    } catch (Exception e) {
        e.printStackTrace();
    }

    return cur;
}

private static long getContactID(ContentResolver contactHelper,
                                 String number) {
    Uri contactUri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI,
            Uri.encode(number));

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

    try {
        cursor = contactHelper.query(contactUri, projection, null, null,
                null);

        if (cursor.moveToFirst()) {
            int personID = cursor.getColumnIndex(ContactsContract.PhoneLookup._ID);
            return cursor.getLong(personID);
        }

        return -1;
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (cursor != null) {
            cursor.close();
            cursor = null;
        }
    }

    return -1; }

how do i filter the unique values from the cursor? and only keep the duplicate contacts according to the phone number if possible?


Solution

  • May be this will work

        try {
            if (startsWith != null && !startsWith.equals("")) {
                cur = contactHelper.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        projection,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " like \"" + startsWith + "%\""
                                + " AND "
                                + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " IN (SELECT " + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " as name FROM view_data GROUP BY " +ContactsContract.CommonDataKinds.Phone.NUMBER + " HAVING COUNT(name)>1)",
                        null,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " ASC");
            } else {
                cur = contactHelper.query(
                        ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                        projection,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " IN (SELECT " + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " as name FROM view_data GROUP BY " +ContactsContract.CommonDataKinds.Phone.NUMBER + " HAVING COUNT(name)>1)",
                        null,
                        ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME
                                + " ASC");
            }
            cur.moveToFirst();
        } catch (Exception e) {
            e.printStackTrace();
        }