Как агрегировать контактные данные при попытке добавить новый контакт?

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

Я использую этот код, чтобы добавить контакт. Нашел его здесь, в 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 агрегировать новую запись с существующими записями, если они соответствуют?


person Pumuckline    schedule 29.03.2012    source источник


Ответы (1)


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

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());
person Michael Mburu    schedule 16.07.2016