2017-08-19 1 views
0

Je développe une application dans laquelle j'ai besoin de stocker des données liées à un contact.Enregistrer les données pour les contacts en ajoute un nouveau

Je liste les contacts dans un recycleView en utilisant un curseur et chaque itemView a un bouton étoile pour définir le contact comme favori (pas le même que le système).

j'ai réussi à stocker les données dans ContactsContract.Data, en faisant ceci:

private void addContactData(long contactId, String displayName, boolean favorite) { 

    // displayName same as the value for Contacts.DISPLAY_NAME_PRIMARY 

    ArrayList<ContentProviderOperation> ops = 
      new ArrayList<>(); 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, CUSTOM_ACCOUNT_TYPE) 
      .withValue(ContactsContract.RawContacts.ACCOUNT_NAME, CUSTOM_ACCOUNT_NAME) 
      .withValue(ContactsContract.RawContacts.CONTACT_ID, contactId) 
      .build()); 

    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, displayName) 
      .build()); 

    ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, CustomData.CONTENT_ITEM_TYPE) 
      .withValue(CustomData.IS_FAVORITE, favorite) 
      .build()); 

    try { 
     ContentProviderResult[] contentProviderResults = cr.applyBatch(ContactsContract.AUTHORITY, ops); 
     return contactUri; 
    } catch (RemoteException | OperationApplicationException e) { 
     Log.e(getClass().getSimpleName(), e.getMessage(), e); 
     return null; 
    } 
} 

Le problème que j'ai est quand deux contacts ont ej exactement le même nom. "Tom" et "Tom" si j'appuie sur le bouton fav, ajoute un troisième contact qui est même répertorié dans l'application de contacts de l'appareil.

Certaines recherches me guied d'ajouter plus de données à distinguer les contacts à l'aide:

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) 
      .build()); 
// OR 

ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI) 
      .withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 
      .withValue(ContactsContract.Data.MIMETYPE, ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE) 
      .withValue(ContactsContract.CommonDataKinds.Email.ADDRESS, email) 
      .build()); 

Et cela a fonctionné très bien, sauf si les champs sont égaux dans les deux contacts. De quoi ai-je besoin pour éviter ce comportement, et pourquoi le CONTACT_ID n'est pas suffisant pour faire ce genre d'opérations?

Répondre

1

Vous devez indiquer à Android de fusionner le nouveau RawContact que vous venez de créer avec un (un ou plusieurs) existant RawContacts.

Vous faites cela en utilisant la table AggregationException, en ajoutant une ligne pour chacun de ces "liens".

Voir: https://stackoverflow.com/a/40869351/819355

Extrait de code:

Builder builder = ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI); 
builder.withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_TOGETHER); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact); 
builder.withValue(AggregationExceptions.RAW_CONTACT_ID2, someExistingRawContact); 
ContentProviderOperation op = builder.build(); 
+0

Merci, cela fonctionne, la seule question que j'ai encore est avec des contacts SIM. Je vois que même les applications comme WhatsApp ajoute le doublon de contacts pour travailler avec, donc je suppose qu'il n'y a pas d'autre moyen de le faire. Je suis à la recherche d'une documentation à ce sujet, mais toujours rien, de toute façon je vous remercie pour l'aide. – GLopez

+0

oui, les contacts sim ne peuvent pas être fusionnés dans d'autres contacts, c'est une limitation du protocole de contacts sim – marmor