2017-08-09 3 views
0

Je développe un sync adapter à sync contacts dans le téléphone avec un ERP system. Tout fonctionne bien sur l'émulateur, mais au téléphone, je reçois de nouveaux numéros de téléphone attachés à des contacts déjà existants qui ont été créés "à la main". Lorsque je supprime les contacts de mon compte, les numéros de téléphone qui ont été insérés sont également supprimés des contacts existants. J'ai même créé un nouveau contact sur l'émulateur puis essayé de synchroniser et tout allait bien, les nouveaux numéros de téléphone n'étaient pas attachés aux anciens contacts. Des idées? modifié: Il n'est pas clair quelle est la structure de base de données de la table RawContacts. Doit faire quelque chose commenuméro de téléphone s'attache au contact existant lors de l'insertion de nouveaux contacts dans les contacts android

rawContactInsertIndex =max(ContactsContract.Data.RAW_CONTACT_ID)+1 

puis incrémenter rawContactInsertIndex au lieu de rawContactInsertIndex = batch.size()?

+0

J'ai supprimé tous les contacts du téléphone manuellement, puis importé .vcf à partir de la sauvegarde, puis installé mon adaptateur de synchronisation et le problème a disparu. Pour autant que je comprenne j'ai eu quelques orphelins dans les contacts. –

Répondre

0

Ce comportement est attendu dans Android, chaque fois qu'un nouveau RawContact est inséré, le système va essayer de vérifier si cette nouvelle RawContact est un double d'un Contact existant, et essayer de se joindre à cette nouvelle RawContact dans ce Contact existant à l'aide du AggregationExceptions table. Il utilise des noms, des téléphones et des e-mails pour rechercher nos contacts existants potentiels pour la fusion.

Si vous ne voulez pas que votre nouveau RawContact me fusionné dans un des contacts existants (cependant, vous devriez revoir ceci est que vous ne voulez pas que vos utilisateurs se plaignent de contacts en double), vous pouvez ajouter une règle TYPE_KEEP_SEPARATE-AggregationExceptions , en précisant votre RawContact ne devrait pas être rejoint:

ContentProviderOperation.newUpdate(AggregationExceptions.CONTENT_URI) 
    .withValue(AggregationExceptions.TYPE, AggregationExceptions.TYPE_KEEP_SEPARATE) 
    .withValue(AggregationExceptions.RAW_CONTACT_ID1, yourNewRawContact) 
    .withValue(AggregationExceptions.RAW_CONTACT_ID2, anExistingRawContact) 
    .build(); 

lorsque je supprime mes contacts de compte ...

ne jamais supprimer Contacts qui étaient crea ted dans le cadre de votre compte, car il peut supprimer RawContacts qui ne sont pas liés à votre compte. Supprimez uniquement votre RawContacts et les contacts associés seront automatiquement supprimés si nécessaire.

Shall faire quelque chose comme

rawContactInsertIndex = max (ContactsContract.Data.RAW_CONTACT_ID) +1

Non! L'ID RawContact est attribué automatiquement, ne le définissez pas vous-même. Vous devriez faire:

.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0) 

et assurez-vous applyBatch toutes les opérations liées ensemble dans le même lot.

+0

Merci d'expliquer AggregationExceptions. J'ai supprimé mon compte rawcontacts plusieurs fois, sans effets secondaires, je spécifie toujours le nom de mon compte et je le tape comme paramètres de requête lorsque je supprime rawcontacts. –

+0

Oui, c'est bien, faites juste attention à ne supprimer que RawContacts. Ne supprimez jamais Contacts, car vous pourriez supprimer les données d'autres comptes. – marmor