# Communication entre coredata, adressbook et ical



## Battant (7 Décembre 2011)

Bonjour,

Je développe actuellement un programme de facturation qui dois gérer des client provenant du carnet d'adresse de mac os x. Outre le fait que je dois ajouter des propriété au abpeersonne, je dois pouvoir les stocker dans ma base de donnée core data. Je dois également stocker les les séance que le client a consommer dans sous forme d'événement ical pour facturation.

Le problème majeur consiste à faire communiquer tout ça par exemple en stockant les abperson du carnet d'ares et les événement du calendrier dans coredata.

Sans compter que je dois pouvoir ajouter des propriété a abperson.

Est-ce possible ?

Merci de me répondre

Salutations

Battant


----------



## Céroce (7 Décembre 2011)

Cela me paraît très possible.

ABPerson hérite de ABRecord qui possède une propriété uniqueId. Tu peux utiliser cet ID dans ta base Core Data pour faire référence à la personne.
De même avec CalCalendarItem et sa propriété uid.


----------



## tatouille (10 Décembre 2011)

pour ce genre d'exercice je te conseillerais d'utiliser sqlite car c'est tres facile de faire des synchros avec un serveur distant qui par exemple tourne mysql (meme logique, coreData te forcera a faire des transposes ca peut etre problematique pour la memoire)

chibiorm est un ORM utilisant FMDatabase, tres souple car tu peux autant faire des requetes SQL directement ou utiliser le model ORM pour tes objets persistants

http://code.google.com/p/chibiorm/

CoreData c'est bien quand tu n'as pas a gerer des relations one to many to many parce que tu seras tres vite bloqué et tu te retrouveras a ecrire des 10nes de lignes de code pour implementer ce mechanisme, de plus pour faire des recherches et comparaisons c'est pas top et c'est lent.


----------



## Battant (16 Décembre 2011)

Bonjour,

Je veux bien essayer ce que vous me proposez mais je doute que ça marche. En effet, le fais d'ajouter un champ avec l'identifiant faisant référence à une autre base de donnée comme le carnet d'adresse ou le calendrier ne semble pas pour autant créer un lien entre elle. Ainsi il me semble qu'il sera impossible de faire une requête comme


```
Select ABperson.nomClient,Prestation where ABpersion.id = prestatio.idCleient
```

Ou encore


```
Select * from ical where adressbook.abPersonId = ?
```


Ne pensez-vous pas qu'il faut un mécanisme de synchronisation, est-ce que isync pourrait m'aider ?

Merci pour votre aide

Salutations

Battant


----------



## Céroce (19 Décembre 2011)

Tu as effectivement 3 bases de données: celle du Managed Object Context de Core Data, celle du carnet d'adresse, celle du calendrier.

Quand tu crées une nouvelle fiche dans le carnet d'adresse, tu conserves l'ID dans une entité Core Data.

Par la suite, tu liras l'ID dans l'entité Core Data ce qui te permettra de retrouver la fiche du carnet d'adresse correspondante.

Les données du carnet d'adresse ne sont donc en aucun cas stockées dans la base Core Data, uniquement l'ID.


----------



## Battant (19 Décembre 2011)

Bonjour,



tatouille a dit:


> pour ce genre d'exercice je te conseillerais d'utiliser sqlite car c'est tres facile de faire des synchros avec un serveur distant qui par exemple tourne mysql (meme logique, coreData te forcera a faire des transposes ca peut etre problematique pour la memoire)
> 
> chibiorm est un ORM utilisant FMDatabase, tres souple car tu peux autant faire des requetes SQL directement ou utiliser le model ORM pour tes objets persistants
> 
> ...



Comme résumé ci-dessus faut-il prendre une base de donnée à part ou core data est-il suffisant sachant que la personne pour qui je développe le programme offre différente prestations que je dois stocker dans la base de donnée et facturer Ical est juste utiliser pour stocker les séances facturée au client. 

A votre avis, faut-il se tourner vers un système de synchronisation comme isync ?

Merci pour votre aide

Salutations

Battant


----------



## tatouille (21 Décembre 2011)

isync ou autre, mais oui ton logiciel doit etre capable de se synchroniser avec l'address Book, tu ne peux pas faire confiance  aux ids d'une base AD surtout si l'utilisateur reconstruit ses contactes ou en importe d'autres, ton logiciel doit savoir cloner/diff l'adresse book de l'utilisateur (la meme pour ical) et surtout detecter les manquants qui peuvent etre liés a des factures ou autres actes de compta, il faut aussi  savoir gerer la synch entre les differents clients attachés a la meme entitée de facturation, la voie royale est un serveur distant, ton logiciel doit avoir un historique fiable et ne peut en aucun cas se baser sur d'autres db dont tu n'as aucun controle, ton logiciel doit cloner et diff ses DBs

si tu suis l'idée de Céroce  tu vas creer un truc totalement bugg'é et mettre l'utilisateur dans la merde sans meme pouvoir lui offrir un support, (l'utilisateur dans ce genre cas, generalement re-demande son argent)

toujours penser: l'utilisateur lambda fait des trucs debiles et ne sauvegarde jamais.

deplus je ne sais pas si tu connais bien comment fonctionne un systeme de facturation dans une grande entreprise:

il peut exister plusieurs entitées de facturation (groupes) qui ne peuvent pas se voir et un super groupe qui peut tout voir (les achats) et il arrive assez frequement qu'une entitée facture une autre entitée (le jeux comptable) et tu dois pouvoir les compter comme " facture virtuelle" ecetera

apres ceci, cela devient payant pour avoir une architecture complete et fiable comme une montre suisse.


----------



## Céroce (22 Décembre 2011)

tatouille a dit:


> si tu suis l'idée de Céroce  tu vas creer un truc totalement bugg'é et mettre l'utilisateur dans la merde sans meme pouvoir lui offrir un support.



Si tu regardes les API d'AB, il y est écrit que l'ID est unique pour un enregistrement. C'est à dire que même si tu changes tous les champs de la fiche, AB est toujours capable de faire le lien avec la fiche.

C'est sûr qu'il y a des limites, que si on efface une fiche du carnet d'adresses, l'application ne pourra plus faire le lien avec, mais c'est un compromis. Dans ta solution, on doit dupliquer toutes les fiches dans notre propre BdD et mettre au point un système de synchro. Ta solution _parfaite_ est longue et lourde à mettre au point; c'est le genre de truc qui fait exploser les temps de dev et donc le coût! 

C'est Battant qui fait la prestation, et c'est à lui de voir par rapport au besoin du client et son budget s'il faut une BdD distante, une gestion fine des groupes, dupliquer toutes les entrées du carnet d'adresse et du calendrier. Souvent, la meilleure solution est celle qui est la plus rapide à développer. La question était "Comment fait on le lien avec les entrées du carnet d'adresse et du calendrier", j'y ai répondu, point.


----------



## Battant (18 Janvier 2012)

Bonjour,

J'ai besoin de votre aide car le syncservice n'est plus disponible sur mac os 10.7. En fait, j'ai deux machine. Une qui tourne sous mac os 10.6.8 et mon nouveau mac qui tourne sur mac os 10.7.2.

Pire : je ne trouve plus la documentation. Même si je trouvais par hasard, l'ancienne adresse de du site de syncservice, je suis automatiquement redirigé vers la page d'accueille du développement de mac os x lion. Si j'ajoute le farmework syncservice et que je vais dans l'un des fichier d'en-tête. Je clique sur l'un des terme et enfin sur search documentation aucun résultat, même pas dans xcode/help.

Selon apple, il nest pas possible d'avoir deux librairie sur un ordinateur. Est-ce vraiment le cas selon vous ?

Néanmoins, j'ai trouvé une partie des résultats sur la machine équipé de mac os 10.6 mais bien sûr pas suffisamment pour continuer.

Remarque : J'ai une drôle d'impression au sujet d'apple. Il me semple qu'en tant qu'utilisateur ou développeur. C'est comme si apple nous emmenait dans une voiture dont eux seul tienne le volant. et nous quand on n'est pas content, on n'a qu'a faire des feed-back sans pour autant pouvoir obtenir un retour en arrière. Dans le cas présent, il est question du remplacement du syncservice par icloud et de la suppression du support des application power pc et de certain drivers. Pour toute ces raison, j'envisage l'éventualité de me tourner vers des api libre tel que gnome, kde ou autre mais là J'ai des problème avec fink et macport (package management system).

Vous pouvez imaginer dans quel merde je me trouve maintenant. Tout ça à cause d'apple qui ajoute des chose mais qui en supprime d'autre.

Je n'ai pas manquer de leur faire un feedback.

Que me conseillez-vous maintenant ?

Merci pour votre aide.

Merci pour votre aide.

Salutations


Battant


----------



## Lio70 (19 Janvier 2012)

Je partage ton analyse d'Apple qui a pour methode de remplacer une ancienne technologie par une nouvelle, toujours assez brutalement, par opposition a Microsoft qui ajoute la nouvelle technologie a l'ancienne, permettant une retrocompatibilite plus souple.

Chaque approche a ses avantages et ses inconvenients.

Hier je consultais justement certaines stats sur les parts de marche des differents o.s. :
http://www.netmarketshare.com/operating-system-market-share.aspx?qprid=10&qpcustomb=
et je vois que 50% des utilisateurs PC sont toujours sur Windows XP qui date de 2002 et nous sommes en 2012. Il s'en passe des choses en informatique en 10 ans !!! Etre sur XP en 2012, j'appelle cela trainer sur XP.

Et sur Mac? L'abandon du support du PowerPC et de Rosetta ne met en lumiere qu'une chose: a quel point certaines applications sont attardees car leurs developpeurs n'ont pas voulu les mettre a jour. Lion met dans l'embarras certains utilisateurs a cause de cela mais a qui la faute?

Lion, iCloud etc... Je crois qu'il ne faut pas se conforter dans un conservatisme refractaire. Tout n'est pas rose dans le monde Lion/iCloud mais il faut accepter d'y sauter a pieds joints sous peine d'etre vite depasse, surtout quand on est developpeur. Et quand on est a fond dans le nouvel ecosysteme, on se rend compte a quel point ce nouveau framework (au sens large du terme) est, comme chaque framework precedent, parfaitement coherent.

Tu t'appretes a lancer une nouvelle application sur le marche. Tes premiers clients seront ceux qui passent du PC au Mac, ou remplacent leur Mac, ou ne le remplacent pas mais passent au nouvel o.s. car ils sont enclins a changer de soft. Ils sont sur Lion et dans une situation ils doivent ou peuvent choisir des applications. Pense a eux en priorite. Les autres qui ne peuvent evoluer car ils sont tributaires d'anciennes applications ont depuis longtemps tout ce qu'il leur faut et ne t'ont pas attendu. S'il sont satisfaits de leur infrastructure IT, ils n'ont pas de raison de changer, donc de remplacer leur solution actuelle par la tienne. Ce seront tes derniers clients.


----------



## Battant (19 Janvier 2012)

Bonjour,Je comprends tout à fait votre point de vu.Toutefois, lorsqu'on fait du développement sur mesure, on doit bien tenir considérer la plate forme du client. Dans le cas présent non client est sur mac os 10.6.Personnellement, j'ai deux machine. Une sur mac os 10.6.8 et l'autre sur mac os 10.7.2.Maintenant j'aurais besoin de syncservice pour synchroniser la base de donnée, le carnet d'adresse de mac os x contenant les clients ainsi que ical contenant des séances à facturer. Les clients sont actuellement stocké dans entourage 2004. Il faut les transférer dans le carnet d'adresse de mac os suis les importer et les synchroniser dans une base.J'ai également pensé à utiliser api kde et gnome mais ces environnement de bureau n'ont encore jamais démarré sur mac os 10.7 Je n'est toutefois pas essaye sur ma machine équipée de mac os 10.6.Pourriez-vous m'aider à trouver la documentation sur syncservice si vous avez plus de chance que moi.Que faire maintenant ?Merci d'avance pour votre aide car je suis vraiment coincé.SalutationsBattant


----------



## Lio70 (19 Janvier 2012)

Dans une situation similaire, j'ai opte pour une base SQLite avec CoreData, contenant une table pour les clients.

Travailler directement sur le carnet d'adresses du Mac comme votre client veut le faire, c'est dangereux a cause des conneries que l'utilisateur peut faire. Exemple: il efface accidentellement une fiche, ou bien il repond sans comprendre a la question Voulez-vous fusionner les deux carnets? lors de l'activation d'un nouveau service du genre iCloud, ou une synchro avec iPhone ou les donnees sont differentes etc... Apres tout, c'est la base qui alimente les factures avec les infos du client. Si les factures se retrouvent videes des infos client,  j'imagine la tete du controleur fiscal. :rateau:

Voir si vous pouvez exporter d'Entourage 2004 dans un fichier CSV et importer celui-ci dans la base SQLite avec une routine dans votre programme, pour constituer le carnet de votre propre appli et pas devoir refaire une nouvelle de clients a la main. On peut alors prevoir dans cette table un champ pour etablir un lien avec le carnet. Si votre client le veut vraiment, il pourrait generer une fiche dans le carnet du Mac au depart de votre application, et l'UID de cette fiche sera stockee dans le champ que j'ai mentionne comme l'a dit Ceroce plus haut. Donc au lieu de faire Entourage -> AddressBook Mac -> votre appli, vous faite Entourage -> votre appli -> AddressBook Mac. Si le carnet du Mac est foutu, les degats sont limites. Il y a pour ces manipulations de fiches AddressBook un exemple de code sur le site dev d'Apple.

Pour enregistrer les seances dans iCal, il est facile de creer des events a partir de votre app. Il y a un exemple de code sur le site dev Apple: "CalendarItems". Attention c'est du vieux code et inutilisable tel quel, il faut le peaufiner mais il permet de comprendre comment creer des events et tasks dans les calendriers iCal.

Pour l'infrastructure de facturation, la remarque de Tatouille est valable mais si votre client est une petite structure, la facturation ne doit pas etre si complexe donc une app de base SQLite/CoreData fera l'affaire.

Ma suggestion n'est pas la panacee universelle mais ca fonctionne. Et pas besoin de syncservice. A vous de voir si cela peut convenir a votre client.


----------



## Battant (27 Février 2012)

Bonjour,

Je suis très intéressé par votre proposition. Maintenant il va me falloir de l'aide.


Je suis sur le point de créer la base de donnée. Maintenant il me faut trouver les driver pour m'y connecter.

En fouillant un peu sur internet, je suis tombé sur ceci

https://github.com/mirek/CoreSQLite3.git

Je l'ai téléchargé avec la command git puis ouvert mais ça ne donne rien.

Suis-je sur la bonne piste ?

Quel pilote avez-vous télécharger ?

Comment faire pour faire le lien entre du code c et objective c ?

Merci de me répondre

Salutations

Battant


----------



## Lio70 (27 Février 2012)

Euh... il n'y a rien a installer. Tu ne connais pas les bases de la programmation de données avec Xcode et tu proposes tes services a un client?! A ce stade, rien ne sert de répondre, on pourrait écrire 100 pages sur ce forum. Il faut lire le guide de programmation Core Data dispo sur le site Apple https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/CoreData.pdf ainsi que la doc afférente.

Premiere démarche: il suffit de créer la base de données dans Xcode a partir du modèle contenu dans le projet (fichier .xcdatamodel). Creez les "entities" c'est a dire les tables de données. Et les "attributes" de chaque entity, c'est a dire les champs de données.


----------

