Savoir utiliser Core data

24

Réponses

  • uocramuocram Membre
    00:03 modifié #32
    Proposition à  essayer :

    Dans MyApp_AppDelegate.m, modifier
    - (NSPersistentStoreCoordinator *)persistentStoreCoordinator;
    
    comme suit :
    <br />// ancien code inactivé :<br />//&nbsp; &nbsp; url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @&quot;MyApp.xml&quot;]];<br /><br />// à  remplacer par ce nouveau code qui teste la phase de développement stockée dans une préférence de l&#39;application en cours de création,<br />// préférence de clé @&quot;PhaseDebug&quot;,<br />// pour proposer un dialogue permettant le choix de supprimer ou non le fichier @&quot;MyApp.xml&quot; à  l&#39;ouverture de l&#39;application :<br />	if ([[[[NSUserDefaultsController sharedUserDefaultsController] values] valueForKey:@&quot;PhaseDebug&quot;] boolValue] == YES)<br />	{<br />		NSString *path = [applicationSupportFolder stringByAppendingPathComponent: @&quot;MyApp.xml&quot;];		<br />		NSInteger choice = NSRunAlertPanel(@&quot;Supprimer le fichier .xml?&quot;, @&quot;Supprimer le fichier &#092;&quot;%@&#092;&quot; definitivement.&quot;, @&quot;Ne pas Supprimer&quot;, @&quot;Supprimer&quot;, nil, [path lastPathComponent]);<br />		if (choice == NSAlertAlternateReturn)	// on supprime<br />		{<br />			if (![[NSFileManager defaultManager] removeFileAtPath:path handler:nil])<br />				NSRunAlertPanel(@&quot;Erreur fichier&quot;, @&quot;Le fichier %@ n&#39;existe pas ou ne peut etre supprime&quot;, @&quot;OK&quot;, nil, nil, path);<br />		}<br />		url = [NSURL fileURLWithPath: path];<br />	}<br />	else<br />	{<br />		url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @&quot;MyApp.xml&quot;]];<br />	}<br />
    


    Créer une préférence  que l'on teste, n'est pas indispensable, commenter/décommenter le code suffit.
    On aussi peut imaginer copier d'abord le fichier @MyApp.xml (en lui ajoutant l'heure comme suffixe, p.e.) dans un dossier de sauvegarde, avant de le supprimer du dossier support aux applications.
  • Paisible.frPaisible.fr Membre
    juin 2008 modifié #33
    Merci, si comprends bien le principe et le code, je ne comprends pas en revanche comment "setter" la variable "PhaseDebug" ?
  • Paisible.frPaisible.fr Membre
    juin 2008 modifié #34
    dans 1214164173:

    Merci, si comprends bien le principe et le code, je ne comprends pas en revanche comment "setter" la variable "PhaseDebug" ?


    J'ai trouvé, cela ce passe par ici :
    /Users/nomutilisateur/Biliothèque/Préférences/com.yourcompany.application.plist

    Et il faut rajouter une entrée de nom "PhaseDebug" de type "Boolean" avec "YES" comme valeur avec Property List Editor.
  • Paisible.frPaisible.fr Membre
    00:03 modifié #35
    Je reviens sur le sujet.
    Plutôt que d'utiliser une variable "debugPhase" dans le fichier de préférences ne serait-il pas mieux, si c'est possible, de le faire avec une compilation conditionnelle en fonction de la phase.

    Je pense à  quelque chose comme cela :

    <br />#define DEBUG<br />#ifdef DEBUG&nbsp; <br />... lines of code ...&nbsp; <br />#endif
    


    1) J'ai pas encore pu essayer car j'ai pas de mac sous le code là 
    2) Je me demande comment faire en sorte qu'il prenne la phase en cours dans mon projet plutôt que de devoir la définir dans un
    #define DEBUG
    
  • Paisible.frPaisible.fr Membre
    00:03 modifié #36
    Ca fonctionne très bien comme cela là  :
    <br />	#ifdef DEBUG<br />		NSString *path = [applicationSupportFolder stringByAppendingPathComponent: @&quot;Carsok.xml&quot;];		<br />		NSInteger choice = NSRunAlertPanel(@&quot;Supprimer le fichier .xml?&quot;, @&quot;Supprimer le fichier &#092;&quot;%@&#092;&quot; definitivement.&quot;, @&quot;Ne pas Supprimer&quot;, @&quot;Supprimer&quot;, nil, [path lastPathComponent]);<br />		if (choice == NSAlertAlternateReturn)	// on supprime<br />		{<br />			if (![[NSFileManager defaultManager] removeFileAtPath:path handler:nil])<br />				NSRunAlertPanel(@&quot;Erreur fichier&quot;, @&quot;Le fichier %@ n&#39;existe pas ou ne peut etre supprime&quot;, @&quot;OK&quot;, nil, nil, path);<br />		}<br />		url = [NSURL fileURLWithPath: path];<br />	#else<br />		url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @&quot;Carsok.xml&quot;]];<br />	#endif<br />
    


    Sans oublier de mettre dans les "projects settings" --> "Preprocesssor macros" : "DEBUG" pour la conf de debug.
    Pour la conf. de release j'en ai profité pour mettre "RELEASE"
  • clampinclampin Membre
    00:03 modifié #37
    Salut a tous...

    Je fais aussi le tutoriel et j'ai un petit soucis

    <br />2008-08-12 08:36:21.501 CodeEnStock[4662] *** -[NSCFString caseInSensitiveCompare:]: selector not recognized [self = 0x54b840]<br />2008-08-12 08:36:21.519 CodeEnStock[4662] *** NSRunLoop ignoring exception &#39;*** -[NSCFString caseInSensitiveCompare:]: selector not recognized [self = 0x54b840]&#39; that raised during posting of delayed perform with target 5bd7f0 and selector &#39;invokeWithTarget:&#39;
    


    Là , je ne vois pas pourquoi ça ne vas pas....
  • ChachaChacha Membre
    00:03 modifié #38
    dans 1218523138:

    [NSCFString caseInSensitiveCompare:]: selector not recognized


    caseInSensitiveCompare  => caseInsensitiveCompare

    Bouh ! :-)

    +
    Chacha
  • AntilogAntilog Membre
    00:03 modifié #39
    Ne pas confondre :
    case in sensitive
    

    et
    case insensitive
    


    :p
  • clampinclampin Membre
    00:03 modifié #40
    dans 1218523619:

    dans 1218523138:

    [NSCFString caseInSensitiveCompare:]: selector not recognized


    caseInSensitiveCompare  => caseInsensitiveCompare

    Bouh ! :-)

    +
    Chacha


    bon, je sens que je vais devoir changer de lunette ou mettre la taille de police dans xcode à  24 :)

    Je me sens honteux là .....
  • MiiMii Membre
    00:03 modifié #41
    Bonjour à  tous !

    Je commence tout juste à  développer des applis pour Mac, et je me suis mise à  ce petit tuto, et biensur j'ai un petit problème ^^ .
    J'ai fini la phase "Interface" et je ne récupère pas les données précédemment entrées en rouvrant l'application.

    Allez, je suis sûre que c'est un problème facile pour qui s'y connaà®t mieux que moi, une idée ??
  • CéroceCéroce Membre, Modérateur
    00:03 modifié #42
    Dans les réglages de ton NSArrayController sous IB, as-tu bien la case "Prepares Content" cochée ?
    (ça peut venir d'autre part).
  • CéroceCéroce Membre, Modérateur
    00:03 modifié #43
    Et sinon, commencer la programmation Cocoa par Core Data, c'est à  s'en dégoûter...
  • MiiMii Membre
    00:03 modifié #44
    Je commence par là  parce que je voulais manipuler une base de données, mais je vais faire un peu le tour de tout les horizons ;) .
    Et si, la case est bien cochée. Une autre suggestion ?
  • Philippe49Philippe49 Membre
    00:03 modifié #45
    Il faut reprendre pas à  pas toute l'interface, comme dit Céroce, les connexions, les cases cochées, les définitions des entities , ton problème vient surement d'un détail mal réalisé.
    Quand à  ce que dit Céroce sur le fait que commencer Cocoa par CoreData est une approche très réductrice, je confirme entièrement, bien que ce dernier soit une très belle technologie par ailleurs (Coredata pas Céroce).
  • MiiMii Membre
    00:03 modifié #46
    Ok, je vais tout reprendre et je vous dis quoi.
  • AntilogAntilog Membre
    00:03 modifié #47
    dans 1232049473:

    Ok, je vais tout reprendre et je vous dis quoi.


    Tu ne serais pas ...

    du Nooooord?
    :brule:
  • MiiMii Membre
    00:03 modifié #48
    Non, picarde, cousine quoi :P .
  • MiiMii Membre
    00:03 modifié #49
    Bon, je l'ai refais, je n'ai toujours pas mes données  :P .
  • Philippe49Philippe49 Membre
    janvier 2009 modifié #50
    • Respecter les Majuscules/Minuscules

    • Bindings bien cochés dans IB

    • Connections entre les +/- et le NSArrayController correctement réalisées (faire un clic droit sur le NSArrayController et les Received Actions add et remove doivent être opérationnels)

    Après, il suffit de taper sur +, cliquer sur la table view , et saisir le nom du sujet
  • uocramuocram Membre
    00:03 modifié #51
    Hello!
    4 vérifications qui peuvent aider à  diagnostiquer :
    1- y a-t-il des données de stockées? : ouvrir dans TextEdit le fichier moi/Bibliothèque/Application Support/MaBase/MaBase.xml (document xml contenant la database et les database infos)
    2- y a-t-il une alerte au démarrage de l'appli. du genre "les données ne correspondent pas au datamodel"? (si oui, il faut bazarder le fichier cité ci-dessus et rentrer de nouvelles données avec le nouveau datamodel, celui contenant les modifications de structure faites depuis la première entrée de données, ce qui créera un nouveau fichier de données)
    3- dans la fenêtre Debugger Console y a-t-il une ou des alertes (dont le texte orienterait sur l'anomalie qui bloque l'affichage des données, qui est le plus souvent une erreur d'orthographe ou de casse sur une Entity, un Attribut ou une Relationship, le texte montrant le plus souvent la mauvaise orthographe en disant que ce n'est pas key value coding compliant)?
    4- dans l'interface, les colonnes de la table où doivent s'afficher les données, sont-elles bien bindées sur les NSTableColumn et non pas sur : NSScrollView ou NSTableView ou NSTextFieldCell et vers le bon NSArrayController pour le Bind To (attention : quand on copie un élément ou qu'on le duplique, tous les bindings et toutes les connections sont supprimées dans la copie, heureusement d'ailleurs). Le NSArrayController est-il bien Bind To le "MaBase_AppDelegate" pour un Model Key Path : ManagedObjectContext

    Bonne chance avec ça déjà , à  suivre...
  • MiiMii Membre
    00:03 modifié #52
    Alors :

    - je pense avoir respecté les minuscules/majuscules,
    - les bindings sont cochés,
    - les connections entre le NSArrayController et les boutons sont faites.

    1/ il n'y a pas de données enregistrées dans la base
    2/ pas d'alerte au démarrage de l'appli
    3/ Debugger Console vide
    4/ bind sur NSTableColumn vers le bon NSArrayController qui bind to le bon AppDelegate avec comme Model Key Path ManagedObjectContext.

    Qui me dit ce que j'ai loupé ? ^^
  • Philippe49Philippe49 Membre
    00:03 modifié #53
    J'ai refait rapidement cette partie du tuto, cela marche nickel. Voilà  un cas bien intéressant  8--)
    Poste donc ton code qu'on regarde directement (Options supplémentaires, supprime le dossier Build pour alléger et compresse)
  • MiiMii Membre
    00:03 modifié #54
    Voilà  le code, j'ai forcément loupé une étape. :P
  • Philippe49Philippe49 Membre
    00:03 modifié #55
    C'est ce que je pressentais, prépares-toi à  du lourd ....









    [move]                    <3 <3 <3 <3 <3 <3 <3                                     <3 <3 <3 <3 <3 <3 <3 <3 <span style="color:purple">[size=18pt]L'interface elle marche parfaitement ![/size]      <3 <3 <3 <3 <3 <3 <3 <3 [/move]<br />























    Il faut taper sur + pour ajouter des données, et ce que tu tapes s'enregistre automatiquement dans la bibliohèque <ton nom de sesion>/Bibliotheque/Application Support/Films
  • MiiMii Membre
    00:03 modifié #56
    Heu, je t'assure que chez moi ça ne marche pas ! ^^
    Je fais bien ce que tu me dis, j'appuie sur +, je tape "toto', ENTER, je ferme, je rouvre : rien.
  • Philippe49Philippe49 Membre
    00:03 modifié #57
    Je n'ai pourtant rien changé dans ton projet !
    Essaie celui-ci
  • MiiMii Membre
    00:03 modifié #58
    Idem, les données ne sont pas enregistrées dans la base.
  • Philippe49Philippe49 Membre
    00:03 modifié #59
    C'est incompréhensible, les deux marchent chez moi, et aucun chez toi ...

    Essaie ton exécutable compilé en Anjou.
  • MiiMii Membre
    00:03 modifié #60
    Bravo ! ça marche parfaitement maintenant !
    Comment as-tu fait pour compiler en Anjou ? Et c'est quoi Anjou ? ^^
  • uocramuocram Membre
    00:03 modifié #61
    Ton projet chez moi marche aussi...

    Dans ton projet, essaie de supprimer le fichier
    Films/build/Debug/Films

Connectez-vous ou Inscrivez-vous pour répondre.