Graphique à  partir de CoreData ?

crocodilcrocodil Membre
18:02 modifié dans API AppKit #1
Bonjour !  :)

Toujours débutant en programmation malgré quelques essais, je suis en train de créer une application pour les apiculteurs, permettant de garder une trace des diverses actions effectuées au rucher ...
Pour l'instant tout marche à  merveille, j'ai commencé avec xCode avec un architecture core Data (j'ai enfin compris comment faire marcher le tout  ;D) ...

j'ai tout de même quelques questions, pour commencer :

Dans mon fichier xcdatamodel, j'ai une entité nommée "Rapport" deux de ses attributs sont "rapport" (du simple texte) et "RapportDate" (une date du calendrier).
J'aimerais pouvoir faire un graphique à  partir de ces données; un graphique avec les dates en abscisse et les rapports sous forme de points sur les bonnes dates par exemple...
Je pense que Quartz doit être la solution, mais comment dire à  Quartz d'aller chercher les données stockées dans la base de donnée coredata ? Je ne trouve pas grand chose sur la toile à  ce sujet ...
Je suis dans le bon ? ::)

bonne journée !

Réponses

  • LeChatNoirLeChatNoir Membre, Modérateur
    18:02 modifié #2
    un iphone avec les mains pleines de miel, c'est pas pratique si ?
    :o
  • crocodilcrocodil Membre
    18:02 modifié #3
    Je n'ai pas encore d'iPhone, c'est pour le mac  :D
    Le cube G4 à  de bonnes dimensions pour lui mettre des petits cadres à  l'intérieur  ;D

    Ce n'est pas faisable de faire une ligne du temps comme je la souhaite de manière pas trop compliquée ?
  • LeChatNoirLeChatNoir Membre, Modérateur
    18:02 modifié #4
    :)
    Bon désolé, ca fait pas avancer ton sujet...
    J'ai malheureusement pas la réponse...
  • GreensourceGreensource Membre
    18:02 modifié #5
    Tient c'est marrant ça, mon Père est justement Apiculteur :D

    pour ce que tu veux faire il faut suivre le modèle MVC préconisé par Apple. Tu as donc ton modèle (tes données) qui correspond à  Core Data et ta vue qui va ce servir de Quartz.
    Entre les deux tu as besoin d'un Controller qui permette de maintenir la cohérence entre ta base Core Data et ton affichage.

    As tu essayé le tuto d'Apple sur Core Data?

    Et sinon à  propos d'Apiculture, tu es toi même Apiculteur? Tu es de quelle région?
  • DrakenDraken Membre
    18:02 modifié #6
    ça existe encore les apiculteurs ? Les abeilles ne sont pas déjà  toutes mortes ?
  • ThibautThibaut Membre
    18:02 modifié #7
    Elles ne sont pas mortes, elles sont reparties sur leur planète.
  • CeetixCeetix Membre
    18:02 modifié #8
    Pour faire des graphiques tu peux utiliser le lien que Steph a donné dans un autre post : http://code.google.com/p/core-plot
  • DrakenDraken Membre
    18:02 modifié #9
    dans 1270580822:

    Elles ne sont pas mortes, elles sont reparties sur leur planète.


    Allo docteur, maman bobo ?

  • yoannyoann Membre
    18:02 modifié #10
    Mais c'est le bordel ici :-p

    Pour répondre à  la question, comme la dit Greensource c'est à  toi d'intéoriger CoreData pour réucpérer les données brutes, les mettres en forme et les affiché dans ta vue, tu peut utiliser plein de techno pour ça, CoreAnimation ou même les NSView en font partie.
  • CeetixCeetix Membre
    18:02 modifié #11
    Oups j'avais pas que l'on était sous Mac ici. Alors mon lien ne sert à  rien, enfin tu peux t'en inspiré une fois tes données retirées de ta DB.

    En tout cas je confirme, c'est un joyeux bordel ^^
  • GreensourceGreensource Membre
    18:02 modifié #12
    Je crois même que vous avez fait fuir Crocodil  B)
    Bravo les gars!
  • crocodilcrocodil Membre
    avril 2010 modifié #13
    dans 1270565406:

    Tient c'est marrant ça, mon Père est justement Apiculteur :D

    pour ce que tu veux faire il faut suivre le modèle MVC préconisé par Apple. Tu as donc ton modèle (tes données) qui correspond à  Core Data et ta vue qui va ce servir de Quartz.
    Entre les deux tu as besoin d'un Controller qui permette de maintenir la cohérence entre ta base Core Data et ton affichage.

    As tu essayé le tuto d'Apple sur Core Data?

    Et sinon à  propos d'Apiculture, tu es toi même Apiculteur? Tu es de quelle région?


    Je termine les différents bindings restant et je vous montre  ;)

    Oui, apiculteur débutant, en Belgique  8--)

    dans 1270633949:

    Pour répondre à  la question, comme la dit Greensource c'est à  toi d'intéoriger CoreData pour réucpérer les données brutes, les mettres en forme et les affiché dans ta vue, tu peut utiliser plein de techno pour ça, CoreAnimation ou même les NSView en font partie.

    Je faisais fausse route en cherchant à  utiliser Quartz donc, je vais regarder de ce côté alors  :)

    dans 1270634428:

    Je crois même que vous avez fait fuir Crocodil  B)
    Bravo les gars!

    Non non, je ne fuis pas  :D
    Mais en tant que grand débutant, je ne maitrise malheureusement pas encore le code, il me faut un peu de temps avant de bien comprendre :-p pour l'instant je n'en ai pas encore écrit pour cette application, je me suis basé sur le tuto d'Apple http://developer.apple.com/cocoa/coredatatutorial/index.html où c'est fort visuel :-) Mais je me doute que le code est indispensable dès que l'on veut aller plus loin ! Je n'hésiterai pas à  m'y plonger sous vos bons conseils/explications ;-)

    Comme je le disais plus haut, dès que les différents boutons,champs de texte et tableView marchent, je vous montre
    Merci pour toutes vos réponses !
  • DrakenDraken Membre
    18:02 modifié #14
    dans 1270633949:

    Mais c'est le bordel ici :-p


    Non, c'est de la culture télévisuelle, faut juste avoir regardé les épisodes de Dr Who pour comprendre.

  • yoannyoann Membre
    18:02 modifié #15
    dans 1270666954:

    dans 1270633949:

    Mais c'est le bordel ici :-p


    Non, c'est de la culture télévisuelle, faut juste avoir regardé les épisodes de Dr Who pour comprendre.


    Au temps pour moi alors :-p

    J'avoue que ça ressemblais plus à  un Kamoulox qu'autre chose ^^
  • crocodilcrocodil Membre
    18:02 modifié #16
    Voila à  quoi cela ressemble actuellement : iBee.app ... Les tableaux et champs de textes sont fonctionnels, seuls quelques boutons résistent encore à  l'envahisseur...
    Voici un screenshot du fichier .xcdatamodel :
    Screenshot2010-04-08at12.40.34009893.png
    Je ne pense pas que ce soit très propre; j'ai essayé auparavant de faire différentes entity : Ruche, Date, Miel, Pollen, ... et de leur associer les différents array controller, mais j'étais confronté à  un problème:
    quand je sélectionnais une ruche, les dates lui correspondant étaient bien affichées, mais en sélectionnant une de ces date, rien ne changeait dans les texfield raccordés au mielcontroller (tout le temps affiché "no selection").. J'avais pourtant mis une contrainte content set sur le mielController pointant vers la relation miel de l'entity Date (je ne sais pas si je m'exprime assez clairement...)

    Pour ce qui est de l'interface, je n'en suis pas satisfait... Je réfléchis à  une présentation plus utile et efficace, j'aimerais remplacer le tableau contenant la liste des ruches par quelque chose de plus visuel, dans le genre d'un IKImageBrowserView, mais je ne sais pas encore comment l'utiliser  B) , et on vite fait de se perdre avec toutes les possibilités ...
    Je me suis tout de même permis de poster pour vous montrer l'avancement, et pour bénéficier de votre inspiration du moment
    J'attaquerai la partie "graphique" ensuite 
    merci et bonne journée !
  • GreensourceGreensource Membre
    18:02 modifié #17
    Super, tu as bien avancé dit donc!

    Par contre au niveau de ta conception, je pense que c'est une erreur d'avoir tout regroupé comme cela, ton découpage initial était le bon. Il faudrait mieux cherché à  résoudre ton erreur plutôt que de tout regrouper comme cela. Pour l'évolution de ton programme tu risques d'être handicapé sinon.

    Pierre
  • Philippe49Philippe49 Membre
    18:02 modifié #18
    Ici tu trouveras de quoi avancer ( il suffit de transcrire les instructions avec des NSBezierPath au lieu de CGPath) 

    Enfin comme le dit Yoann, il faut aller lire les infos dans ta base CoreData, et faire toi-même la traduction graphique.
  • crocodilcrocodil Membre
    18:02 modifié #19
    Bonsoir,
    sous vos conseils bienveillants, je recommence la structure du .xcdatamodel...
    J'en ai profité pour revoir complètement l'apparence du logiciel..et ses fonctions...
    Merci beaucoup Phillippe49 pour le lien, je regarderai cela de plus près une fois les premières étapes passées... Je pense que je visais trop loin pour un premier coup...

    Je suis pour l'instant confronté au même problème que précédemment, je m'explique;
    Quand je sélectionne une ruche (dans un tableau), j'ai accès aux dates qui la concernent ça c'est ok :)
    ce que je n'arrive pas à  faire c'est accrocher une information à  une date (qui serait donc liée à  une ruche particulière)... Que ce soit une info concernant les cadres, la récolte ou un traitement !

    voici un screenshot :
    1098361.png

    voici les différents bindings de 3 entity reliées entre-elles :

    l'entity Ruche :
    Screenshot2010-04-15at22.42.19044615.png

    l'entity Date :
    Screenshot2010-04-15at22.42.23018805.png

    et l'entity Cadre :

    Screenshot2010-04-15at22.42.28052519.png

    Je pense que le problème doit être situé au niveau de l'entity Cadre, mais je sèche ...
    Voici aussi l'état actuel de l'application pour vous donner une idée :
    iBee


    Dans la partie Cadres du tab "Edition" je compte mettre une image de cadre par cadre présent dans la ruche, avec la possibilité de cliquer dessus pour changer l'état du cadre afin d'indiquer son contenu (couvain (=oeufs), pollen, miel, cellule royales, cellules de mâles,...)
    La "vue générale" comprendrait quant à  elle les différentes ruches sous forme des cadres imagés avec les dernières informations en date (qui auront été rentrées dans la partie édition auparavant)... Je vous demanderai certainement de l'aide plus tard, mais chaque chose en son temps :-))

    Un tout grand merci !
  • crocodilcrocodil Membre
    18:02 modifié #20
    Ca doit être tout bête, mais je ne trouve pas  >:)

    (Mes questions s'éloignant de celle d'origine, devrais-je créer un nouveau topic plus général sur mon application dans le bon forum ?)
    Merci  ;)
  • crocodilcrocodil Membre
    18:02 modifié #21
    Je n'aime pas poster plusieurs fois de suite, mais je ne vois vraiment pas d'où vient mon problème, que fais-je donc de mal ?  :(
    Un petit coup de pouce de quelqu'un ?
    [size=8pt]Je suis sûr que ce n'est pas d'un niveau très élevé et que mes questions peuvent sembler/être basiques...mais je veux bien faire...[/size] o:)
  • CéroceCéroce Membre, Modérateur
    18:02 modifié #22
    C'est pas qu'on ne veut pas te répondre, mais peu de gens utilisent CoreData par ici...
  • crocodilcrocodil Membre
    18:02 modifié #23
    Oups, je n'étais pas au courant ... Merci de me l'avoir signalé... Pardon de vous avoir secoué  :o

    Soit, j'ai trouvé une piste supplémentaire; en faisant un projet de test, je suis arrivé à  avoir 3 entités  avec la structure que je recherche; c'est à  dire une entity 3 qui dépend d'une entity 2 qui elle même dépend d'une entity 1. J'avais oublié de cocher le bouton "Validate immediatly" pour les array Controller ...

    Le problème actuel est le suivant :
    L'entity Cadres dépend de l'entity Date (il y a un content set, de sorte à  ce que l'entity Cadres n'affiche que les données pour la date sélectionnée).
    Une entity Date est crée en appuyant sur un bouton "+" et on la voit apparaà®tre dans une NSTableView...
    Il faudrait qu'une entity Cadres soit crée automatiquement dès qu'une entity Date est crée, afin de pouvoir y stocker des données mais je ne vois pas encore comment faire ...
    Il serait évidemment plus facile de mettre tous les attributs de l'entity Cadres comme attributs de l'entity Date pour qu'ils soient directement prêts à  être remplis d'informations dès la création de l'entity Date, mais ce ne serait pas très propre...
    Si quelqu'un voit quel est le bouton magique, ...  o:)
  • MickMick Membre
    mai 2010 modifié #24
    Bonjour,

    Je te suggère de créer dans l'appDelegate une méthode addDate. Il te faut bien sûr éventuellement des outlets qui pointent vers tes NSArrayController d'interface builder afin d'attribuer des choses utiles à  ta nouvelle "Date" (du genre, la ruche selectionnée)
    Tu connectes ton bouton + à  cette méthode addDate.
    La méthode serait quelque chose de style :
    <br />- (void)addDate:(id)sender {<br />NSManagedObject *nouvelleDate=[NSEntityDescription insertNewObjectForEntityForName:@&quot;Date&quot; inManagedObjectContext:managedObjectContext];<br />NSManagedObject *nouveauCadre=[NSEntityDescription insertNewObjectForEntityForName:@&quot;Cadre&quot; inManagedObjectContext:managedObjectContext];<br />[nouveauCadre setValue:nouvelleDate forKey:@&quot;date&quot;]; //Pour bien initialiser la relation Date du cadre.<br />[nouveauCadre setValue:.... forKey:@&quot;...&quot;]; Pour initialiser je ne sais trop quoi<br />
    


    J'ai testé sur un mini projet, cela fonctionne.

    Le gros avantage de CoreData est le maintient automatique des relations (pas besoins de se prendre la tête à  faire des set... à  chaque création d'un objet pour mettre à  jour des données). L'autre avantage est la gestion des règles de validation.

    Sinon, j'utilise plutôt des structures plus classiques et j'use et abuse des NSDictionary => La plupart de mes structures de données ne sont que des dictionnaires ! (il ne sert à  rien de subclasser NSObject pour finalement créer ce qu'un NSDictionary fait déjà  très bien !). Mais il est vrai que le maintient des relations (notamment inverses) est plus galère qu'avec CoreData.

    Juste une petite remarque : j'ai l'impression que tu confonds différentes choses. Les screenshots que tu montrent indiquent les inspecteurs IB des CONTROLEURS, pas des ENTITES comme tu le mets en titre. Tu ne touches en rien à  la structure de données en bidouillant les paramètres ici. Ce que tu configures c'est une instance de la classe NSArrayController, qui aura pour fonction, puisque tu est en mode "Entity" avec managedObjectContext, de pouvoir te retourner un NSArray de NSManagedObjects qui correspondent à  l'entité que tu as mis dans "Entity" de l'inspecteur, et de maintenir un pointeur vers un NSManagedObject (ou un tableau si la sélection multiple est autorisée) qui sera la "selection". le controleur n'est pas le tableau de données !.

    Je pense qu'il faut tu tu prennes le temps de réfléchir sur la notion de paradigme model-view-controller. Une VUE ne "stocke" pas de donnnées, elle affiche des choses et elle répond à  des évènements (clic, touche pressée...). Elle interroge un CONTROLEUR pour savoir quoi afficher où. C'est là  que des contrôleurs tout faits sont disponibles (NSArrayController et NSObjectController), et que les bindings te font gagner énormément de temps, mais il faut avoir derrière la tête une bonne idée précise de comment les choses se passent concrètement, sinon les boulettes sont assurées. Les controleurs "clés en main" ne sont évidemment pas suffisants, et il faut créer sont petit controller à  soit, avec des méthodes persos qui permettent de "customiser" le comportement de l'application (c'est ici ton cas, puisque tu veux que telle action en entraine une autre..). L'idée est de ne pas réinventer la poudre et d'utiliser ce qu'Apple nous fourni gracieusement. Enfin, le controleur va agir sur les DONNEES : il va y accéder à  la demande d'une vue pour affichage, ou il va les modifier... à  la demande d'une vue (champ de texte venant d'être édité, bouton cliqué ...). Le controleur (ce que tu bidouilles dans tes screenshot) est donc le flic de l'application qui fait l'intermédiaire entre les vues et les données. Le controleur ne "stocke pas" les données, il y accède. La couche DONNEES de la plupart de mes applications est relativement limités puisqu'elle se contente de NSDictionary et de NSArrays, je n'ai donc quasiment jamais pas de classe perso de la couche DONNEES.

    J'espère ne pas avoir dit trop de bêtises et d'avoir été clair...
    Bon courage.
  • crocodilcrocodil Membre
    18:02 modifié #25
    Fini les examens, je peux me remettre dans le code  ;)

    Merci beaucoup Mick pour tes explications claires et précises, je comprends mieux à  présent  :)
    J'ai réussi à  implémenter ton code dans un mini-projet, et cela fonctionne  :D , je pense avoir fait un bon pas... je devrais réussir à  l'appliquer aussi dans iBee...

    Un tout grand merci  :), je vous tiens au courant...
Connectez-vous ou Inscrivez-vous pour répondre.