AdressBook : ajouter un numéro de téléphone à un contact
Bonjour,
Je souhaiterais parcourir la liste des personnes du carnet d'adresse et ajouter un numéro par défaut.
Voici le code que j'utilise et qui ne fonctionne pas :
Quelque chose ne fonctionne pas car le "0000000000" n'apparait jamais dans le carnet d'adresse après excution de mon programme. Cependant, la compilation se fait sans erreur ni warning et l'exécution également.
Quelqu'un aurait une idée ?
Merci d'avance,
oBo.
Je souhaiterais parcourir la liste des personnes du carnet d'adresse et ajouter un numéro par défaut.
Voici le code que j'utilise et qui ne fonctionne pas :
<br /> //Create an instance of address book<br /> ABAddressBookRef allPeople = ABAddressBookCreate();<br /> //Get the number of people<br /> CFIndex len = ABAddressBookGetPersonCount(allPeople);<br /> //For each people<br /> for(int i = 0; i < len; i++)<br /> {<br /> ABRecordID rid = i + 1;<br /> //Get an instance of a person with its index<br /> ABRecordRef person = ABAddressBookGetPersonWithRecordID(allPeople, rid);<br /> //Get the list of phone numbers<br /> ABMultiValueRef phoneNumbers = ABRecordCopyValue(person, kABPersonPhoneProperty);<br /> //Create a mutable list of phone numbers<br /> ABMutableMultiValueRef mutablePhoneNumbersList = ABMultiValueCreateMutableCopy(phoneNumbers);<br /> //Add a new entry in the list of phone numbers<br /> ABMultiValueAddValueAndLabel(mutablePhoneNumbersList, @"0000000000", (CFStringRef)@"default", NULL);<br /> //Set the new list to the person<br /> ABRecordSetValue(person, kABPersonPhoneProperty, mutablePhoneNumbersList, nil); <br /> }<br />
Quelque chose ne fonctionne pas car le "0000000000" n'apparait jamais dans le carnet d'adresse après excution de mon programme. Cependant, la compilation se fait sans erreur ni warning et l'exécution également.
Quelqu'un aurait une idée ?
Merci d'avance,
oBo.
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mon code passe toujours dans la partie "Pas de changements". Ce qui veut dire que lorsque je modifie mon instance de
Elle n'est pas modifiée dans le ABAdressBookRef allPeople.
En parcourant le Address Book Programming Guide for iPhone OS on peut voir dans la partie "Working with Person Records" que l'on peut ajouter et supprimer un contact. Cependant il n'est pas mentionné que l'on puisse mettre à jour un contact.
Quelqu'un aurait des infos à ce sujet ?
Ce n'est qu'une idée parce que je cantonne mon activité à Cocoa et à l'objective-C mais il n'y a pas de raisons que tu puisses accéder à ta liste de numéros de téléphone sans passer par son index et je n'ai pas vu ça dans ton code. D'après le peu que je sais de C ...
En objet tu commence par chercher l'index de ton identifiant et en l'occurence je ne connais pas de "default"
extern CFStringRef const kABPhoneProperty; // Generic phone number - kABMultiStringProperty
extern CFStringRef const kABPhoneWorkLabel; // Work phone
extern CFStringRef const kABPhoneHomeLabel; // Home phone
extern CFStringRef const kABPhoneMobileLabel; // Cell phone
extern CFStringRef const kABPhoneMainLabel; // Main phone
extern CFStringRef const kABPhoneHomeFAXLabel; // FAX number
extern CFStringRef const kABPhoneWorkFAXLabel; // FAX number
extern CFStringRef const kABPhonePagerLabel;
Et si tu as créé la tienne alors tu dois commencer par chercher son index ..
hth
La doc spécifie bien que l'utilisateur peut créer ses propres labels de numéros de téléphone.
Quoiqu'il en soit j'ai trouvé la solution à mon problème ; il faut :
1: garder une copie de l'entrée du carnet d'adresse à modifier
2: modifier la copie
3: supprimer l'originale
4: ajouter la copie modifier
Voici le code fonctionnel :
Ma seule inquiétude est la suivante :
Est-ce que ça me garantit de bien conserver une copie de l'entrée du carnet d'adresse et que celle-ci ne sera pas effacée par mégarde au moment du
Voilà , je n'ai testé qu'une fois et tout a marché parfaitement : j'ai bien eu un nouveau numéro 0000000000 labellisé "Default" dans mon contact.
Je n'ai jamais dit le contraire !
Je n'ai pas regardé la doc mais es tu sûr de garder le même identifiant ?
Dans le cas contraire si ton utilisateur synchronise avec Carnet d'Adresses sur sa machine de bureau tu vas avoir des doublons.
Me semble t-il ...
hasUnsavedChanges veut dire que certains changements n'ont pu être sauvegardés sur le disque, pas qu'il y a eu des modifications dans la mémoire vive. Enfin c'est comme ça que j'ai lu la doc. En fait c'est le problème d'une base de données qui peut être modifiée par plusieurs applications/utilisateurs en même temps.
Et en ce qui concerne ta méthode un peu sauvage à mes yeux de dupliquer/modifier la copie/supprimer l'original j'avais tout faux: effectivement tu gardes l'identifiant, de cette manière tu n'auras pas de doublons. Par contre tu te fatigues peut être pour rien car il ne semble pas copier mais juste ajouter un retain à l'objet en mémoire:
=> fakePerson: 1ba410 lAvatar: 1ba410
Remarque dupliquer/modifier/remplacer l'original c'est comme ça qu'il faut faire avec les propriété multivalues: les copier dans un MutableMultivalues, y faire les modifs, recopier le MutableMulti dans la propriété..
Mais ça ne concerne qu'une petite collection, pas tout l'enregistrement.
Enfin, en ce qui concerne un numéro de téléphone "par défaut" Le Carnet d'Adresses a le "primaryIdentifier" qui permet d'indiquer pour chaque personne quel numéro de téléphone est celui par défaut !
C'est vrai aussi pour les autres "MultiValues" comme l'adresse ou l'email ..
hth