Как объединить контактные данные, при попытке добавить новый контакт? - PullRequest
2 голосов
/ 29 марта 2012

Я создаю приложение, в котором вы можете загрузить адрес любой точки интереса для ваших личных контактов.

Я использую этот код, чтобы добавить контакт.Нашел это здесь, в Stackoverflow.;)

ops = new ArrayList<ContentProviderOperation>();
            ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
   .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
   .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null).build());

//------------------------------------------------------ Names
if (title != null) {
   ops.add(ContentProviderOperation
        .newInsert(ContactsContract.Data.CONTENT_URI)
         .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
         .withValue(ContactsContract.Data.MIMETYPE,ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
         .withValue(ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME, title).build());
}

//------------------------------------------------------ Work Numbers
if (phone != null) {
   ops.add(ContentProviderOperation
       .newInsert(ContactsContract.Data.CONTENT_URI)
       .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
       .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
       .withValue(ContactsContract.CommonDataKinds.Phone.NUMBER, phone)
       .withValue(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_COMPANY_MAIN).build());
}

//------------------------------------------------------ Address
ops.add(ContentProviderOperation
    .newInsert(ContactsContract.Data.CONTENT_URI)
    .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
    .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE)
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.TYPE, ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK)
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.CITY, city)
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE, zip)
    .withValue(ContactsContract.CommonDataKinds.StructuredPostal.STREET, street).build());

getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops);

Это прекрасно работает, если этот контакт не существует.Иначе, добавление записи добавит другие повторяющиеся записи, даже если все данные в точности совпадают.Читая эту статью , особенно часть об агрегации, я подумал, что Android справится с этим автоматически.Но, очевидно, это не для меня.

Есть ли простой способ заставить Android объединить новую запись с существующими записями, если они соответствуют?

1 Ответ

1 голос
/ 16 июля 2016

Этот вопрос довольно старый, но я решил его недавно, только если кто-то застрял, попробуйте добавить режим агрегирования, как показано ниже. Добавьте его туда, где вы создаете свой аккаунт

ops.add(ContentProviderOperation
                    .newInsert(addCallerIsSyncAdapterParameter(ContactsContract.RawContacts.CONTENT_URI, true))
                    .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, Constants.ACCOUNT_NAME)
                    .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, Constants.ACCOUNT_TYPE)
                    .withValue(ContactsContract.RawContacts.AGGREGATION_MODE,
                            ContactsContract.RawContacts.AGGREGATION_MODE_DEFAULT)
                    .build());
...