2012-03-29 7 views
2

Ich baue eine App, wo Sie die Adresse eines beliebigen Punktes von Interesse für Ihre persönlichen Kontakte herunterladen können.Wie aggregieren Sie Kontaktdaten, wenn Sie versuchen, neue Kontakte hinzuzufügen?

Ich verwende diesen Code, um den Kontakt hinzuzufügen. Hab es hier bei Stackoverflow gefunden. ;)

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); 

Das funktioniert gut, solange dieser Kontakt nicht existiert. Sonst fügt das Hinzufügen eines Eintrags weitere doppelte Einträge hinzu, auch wenn alle Daten identisch sind. Beim Lesen dieses article, vor allem der Teil über Aggregation, dachte ich, Android könnte das automatisch umgehen. Aber offensichtlich nicht für mich.

Gibt es eine einfache Möglichkeit, Android zu zwingen, den neuen Eintrag mit vorhandenen Einträgen zu aggregieren, wenn sie übereinstimmen?

Antwort

0

Diese Frage ist ziemlich alt, aber ich löste dies vor kurzem nur, wenn jemand anderes festsitzt, versuchen Sie, den Aggregationsmodus wie folgt hinzuzufügen. Fügen Sie es hinzu, wo Sie Ihr Konto erstellen

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());