Savoir utiliser Core data

muqaddarmuqaddar Administrateur
juin 2010 modifié dans Actualités #1
Un super article d'uocram sur l'utilisation de Core Data.
Pour aider de nombreux débutants à  utiliser Core Data, Jean-Marc a créé un tutorial pas-à -pas en HTML.

A télécharger ici.
«134

Réponses

  • veveveve Membre
    23:52 modifié #2
    je n'arrive pas à  le faire fonctionner au niveau de la 2e page  :'( . j'ai cela...

    2007-02-06 18:31:58.563 CodeEnStock[800] *** NSRunLoop ignoring exception &#39;Cannot perform operation since entity with name &#39;(null)&#39; cannot be found&#39; that raised during posting of delayed perform with target 37dc30 and selector &#39;invokeWithTarget:&#39;<br />
    
  • uocramuocram Membre
    23:52 modifié #3
    Dans IB, dans l'inspecteur, dans les Attributes du NSArrayController :
    ? as-tu bien renseigné l'Entity et non la Class?
    ? le nom de l'Entity doit être identique, y compris la casse, à  celui donné dans le datamodel dans Xcode (un copier coller est prudent au début, notamment si le nom choisi est compliqué)

    Cf copie d'écran jointe.
    erreurpossible

    [Fichier joint supprimé par l'administrateur]
  • veveveve Membre
    23:52 modifié #4
    Merci ça marche maintenant  :o <3
  • dakujadakuja Membre
    23:52 modifié #5
    Bonjour,

    Tout d'abord merci beaucoup pour ce tutorial absolument génial, j'ai appris enormement grace à  lui.

    Pour aller plus loin, j'ai une question. J'ai bien un NSArrayController qui est bindé avec une entité qui contient plusieurs propriétés de plusieurs type. Ce que je voudrais, c'est qu'au lieu de créer une nouvelle instance vide de l'entité en question, je voudrais pouvoir initialiser les différentes propriétés à  l'aide de Textfield et autres objets d'interface.

    Donc quand j'appuie sur le bouton Add, il faudrait que le ArrayController recupère les données dans ces différents objets.

    Est ce que c'est faisable avec le Binding ? si oui (ce serait super) comment ?

    sinon est ce qu'il y a des exemple de code ? je débute en Objective C et j'ai encore du mal à  l'utiliser.

    Merci  ::)
  • dakujadakuja Membre
    23:52 modifié #6
    Bon étant donné que je ne trouve rien avec le binding, je l'ai fait pas le code. J'ai  fait un customArrayController dans lequel je lie les textfield et autres champs dont j'aurais besoin pour l'ajout. Puis j'ai implémenté une nouvelle fonction qui lit ces champs pour les mettre dans un nouveau NSManagedObject.

    Pour récupérer le contexte, j'ai du aussi lier le AppDelegate généré par l'application.

    J'ai l'impression que c'est un peu bourrin mais ça marche :)

    Je met le code si ça en interesse certain (je débute en objective C, alors il y a peut etre des choses étranges)

    fichier entete
    <br />#import &lt;Cocoa/Cocoa.h&gt;<br />#import &quot;SimpleMoney_AppDelegate.h&quot; // pour le contexte<br /><br />@interface AccountLineArrayController : NSArrayController <br />{<br />&nbsp; &nbsp; IBOutlet SimpleMoney_AppDelegate *dataManager; // pour le contexte<br />&nbsp; &nbsp; IBOutlet NSTextField *objet; // le champs qu&#39;on veut recuperer<br />}<br /><br />- (IBAction) addWithData:(id)sender; // la nouvelle action<br /><br />@end<br />
    



    Fichier source
    <br />#import &quot;AccountLineArrayController.h&quot;<br /><br /><br />@implementation AccountLineArrayController<br /><br />- (IBAction) addWithData:(id)sender<br />{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSManagedObject * line = [NSEntityDescription<br />&nbsp; &nbsp; &nbsp; &nbsp; insertNewObjectForEntityForName:@&quot;AccountLine&quot; // nom de l&#39;entité<br />&nbsp; &nbsp; &nbsp; &nbsp; inManagedObjectContext:[dataManager managedObjectContext]]; // contexte<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [line setValue:[objet stringValue] forKeyPath:@&quot;object&quot;]; // ajout de la valeur<br /><br />&nbsp; &nbsp; [super addObject:line]; // ajout de l&#39;objet dans le NSArrayController	<br />}<br /><br />@end<br />
    
  • uocramuocram Membre
    23:52 modifié #7
    Hello!
    Peut être cette adresse te sera-t-elle utile :
    http://developer.apple.com/documentation/Cocoa/Conceptual/NSPersistentDocumentTutorial/index.html#//apple_ref/doc/uid/TP40001799

    C'est un exemple d'implémentation de la saisie d'une nouvelle entrée par l'intermédiaire d'une "sheet" dans un managed object context séparé.

    Bonne chance
  • dakujadakuja Membre
    23:52 modifié #8
    Merci beaucoup  ,
    cette page est effectivement très interessante et correspond exactement à  ce que je cherchais, et je vais changer pour utiliser leur méthode (qui doit être surement plus propre que la mienne :) )
  • gogaulegogaule Membre
    23:52 modifié #9
    Bonjour .
    [Session started at 2008-03-02 15:12:19 +0100.]
    2008-03-02 15:12:25.863 CodeEnStock[22793] *** Assertion failure in -[NSApplication _commonBeginModalSessionForWindow:relativeToWindow:modalDelegate:didEndSelector:contextInfo:], AppKit.subproj/NSApplication.m:3057
    2008-03-02 15:12:25.874 CodeEnStock[22793] Modal session requires modal window

    Que ce passe t il ? ou quel erreur j' ai commise ?
    Merci
    Cordialement.
  • gogaulegogaule Membre
    23:52 modifié #10
    Bonjour .
    J' ai compris   
    Merci
    Cordialement .
  • chkdskschkdsks Membre
    23:52 modifié #11
    Je suis en train de faire cet excellent tutorial, mais j'obtiens une erreur au lancement de l'application que je ne comprends pas :

    "The managed object model version used to open the persistent store is incompatible with the one that was used to create the persistent store"

    J'utilise Xcode 3, voici le projet : http://chkdsks.free.fr/CodeEnStock.zip

    Merci

    :why?:

  • NseaProtectorNseaProtector Membre
    23:52 modifié #12
    C'est marrant je n'est pas le même message au lancement de l'application.
    Voila ce que j'ai dans la console
    2008-04-15 12:44:34.467 CodeEnStock[566:10b] An uncaught exception was raised<br />2008-04-15 12:44:34.468 CodeEnStock[566:10b] [&lt;CodeEnStock_AppDelegate 0x13b4f0&gt; valueForUndefinedKey:]: this class is not key value coding-compliant for the key managedObjetContext.<br />2008-04-15 12:44:34.478 CodeEnStock[566:10b] *** Terminating app due to uncaught exception &#39;NSUnknownKeyException&#39;, reason: &#39;[&lt;CodeEnStock_AppDelegate 0x13b4f0&gt; valueForUndefinedKey:]: this class is not key value coding-compliant for the key managedObjetContext.&#39;<br />
    


    Si ça peut faire avancer le schmilblick ?
  • Philippe49Philippe49 Membre
    23:52 modifié #13
    managedObjetContext ou managedObjectContext ?
  • NseaProtectorNseaProtector Membre
    23:52 modifié #14
    Comme j'ai fait un copier/coller de la console, c'est bien objet qui est marqué.
  • chkdskschkdsks Membre
    23:52 modifié #15
    Oui, c'est une erreur de ma part, merci !!
    Mais ce n'est pas la même erreur :P, j'ai toujours dans la console:

    "This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation."

    Mon application s'ouvre sans les données précédemment entrées.
    Nouvelle version : http://chkdsks.free.fr/CodeEnStock.zip
  • NseaProtectorNseaProtector Membre
    23:52 modifié #16
    à  Philippe49 :
    Il a dut t'arriver les pires misères pour remarquer aussi vite ce genre d'erreur, non ?

    Sinon:
    Il suffit de cliquer dans le menu edit -> find  dans le projet
    et de remplacer objet par object .
    On recompile et ça marche...
  • NseaProtectorNseaProtector Membre
    23:52 modifié #17
    "This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation."

    Mon application s'ouvre sans les données précédemment entrées.


    Cela doit venir de ta config., parce que chez moi cela fonctionne, lorsque j'ouvre à  nouveau l'application les données précédemment rentrées sont bien là . On serait sur windows, je te dirais redémarre ::)...
  • Philippe49Philippe49 Membre
    23:52 modifié #18
    dans 1208259732:

    à  Philippe49 :
    Il a dut t'arriver les pires misères pour remarquer aussi vite ce genre d'erreur, non ?


    Oh là  là  ....  ;D si tu savais
    Bienvenu dans le club
  • chkdskschkdsks Membre
    23:52 modifié #19
    J'ai trouvé, c'était à  cause du fichier "~/Library/Application Support/CodeEnStock/CodeEnStock.xml", corrompu entre les différentes étapes du développement.
  • NseaProtectorNseaProtector Membre
    23:52 modifié #20
    Donc cela venait bien de chez toi. Et c'est logique que cela fonctionnait chez moi. La prochaine version on l'exécute chez qui ? :P
  • uocramuocram Membre
    23:52 modifié #21
    "The managed object model version used to open the persistent store is incompatible with the one that was used to create the persistent store"


    Lorsque l'on modifie le data model, en ajoutant une entity ou un attribut, le plus souvent cela se passe sans problème.
    Mais quand on en supprime une/un, ou que l'on en modifie le type, le genre de message cité ci-dessus apparaà®t, pour signaler que la structure du data model ne correspond pas à  celle décrite dans le "store", fichier de la base de données enregistré là  par défaut : /Users/moncompte/Bibliotheque/Applications Support/MonAppli/MonAppli.xml.
    Il peut être mécontent à  l'ouverture de l'appli, ou lors de la sauvegarde automatique lors de la fermeture.
    Pendant la création de l'appli, à  chaque modification de structure, il vaut mieux supprimer le fichier MonAppli.xml (ou .sql, selon votre choix de base de données). Il s'en crée un nouveau, correspondant à  la nouvelle structure, mais vide de données!!!.
    Il vaut mieux attendre la fin de la mise au point de la structure avant de rentrer beaucoup de données, ou alors se créer dès le début, un importateur/exportateur indépendant de la structure (important des fichiers texte du format TTR par exemple).
  • stounfrstounfr Membre
    23:52 modifié #22
    Bonjour,

    Je suis en train de suivre ce tuto mais j'ai une erreur lors de la 3ème page :

    CodeEnStock_AppDelegate.h:32: error: parse error before '{' token

    code incriminer :
    <br />- (IBAction)showTypesSujets:(id)sender<br />{<br />	[self openSheet:typesSujetsPanel]; // L&#39;outlet que l&#39;on a déclaré au-dessus comme paramètre<br />}<br />
    


    je ne comprend pas bien mon erreur, est ce que quelqu'un pourrai m'orienter ?
    Stounfr
  • Philippe49Philippe49 Membre
    23:52 modifié #23
    Une "parse error" déclarée à  la ligne 32 peut provenir d'une ligne qui se situe avant (oubli d'une accolade, parenthèse, .. ) d'un identificateur mal orthographié, d'un copier-coller avec des caractères invisibles qui restent, ...
    Le plus simple c'est de "nettoyer le code"
  • stounfrstounfr Membre
    23:52 modifié #24
    Ok merci pour l'info,

    mais je ne vois pas ou j'ai fait une bourde.
    Voici le code source de mon CodeEnStock_AppDelegate.h

    <br />//<br />//&nbsp; CodeEnStock_AppDelegate.h<br />//&nbsp; CodeEnStock<br />//<br />//&nbsp; Created by Stoun on 05/06/08.<br />//&nbsp; Copyright __MyCompanyName__ 2008 . All rights reserved.<br />//<br /><br />#import &lt;Cocoa/Cocoa.h&gt;<br /><br />@interface CodeEnStock_AppDelegate : NSObject <br />{<br />&nbsp; &nbsp; IBOutlet NSWindow *window;<br />	IBOutlet NSPanel *typesSujetsPanel;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; NSPersistentStoreCoordinator *persistentStoreCoordinator;<br />&nbsp; &nbsp; NSManagedObjectModel *managedObjectModel;<br />&nbsp; &nbsp; NSManagedObjectContext *managedObjectContext;<br />}<br /><br />- (NSPersistentStoreCoordinator *)persistentStoreCoordinator;<br />- (NSManagedObjectModel *)managedObjectModel;<br />- (NSManagedObjectContext *)managedObjectContext;<br /><br />- (IBAction)saveAction:sender;<br /><br /><br />- (void)openSheet:(NSWindow *)sheet;&nbsp;  // méthode générique d&#39;ouverture de Sheet<br />- (IBAction)closeSheet:(id)sender;&nbsp; &nbsp;  // action de fermeture générique de Sheet<br /><br />- (IBAction)showTypesSujets:(id)sender;<br />- (IBAction)showTypesSujets:(id)sender<br />{<br />	[self openSheet:typesSujetsPanel]; // L&#39;outlet que l&#39;on a déclaré au-dessus comme paramètre<br />}									&nbsp;  // de la fonction générique d&#39;ouverture de sheet<br /><br />@end<br />
    


    et voici mon CodeEnStock_AppDelegate.m

    <br />//<br />//&nbsp; CodeEnStock_AppDelegate.m<br />//&nbsp; CodeEnStock<br />//<br />//&nbsp; Created by Stoun on 05/06/08.<br />//&nbsp; Copyright __MyCompanyName__ 2008 . All rights reserved.<br />//<br /><br />#import &quot;CodeEnStock_AppDelegate.h&quot;<br /><br />@implementation CodeEnStock_AppDelegate<br /><br />- (void)openSheet:(NSWindow *)sheet<br />{<br />	[NSApp beginSheet:sheet&nbsp; &nbsp; // La sheet que l&#39;on veut afficher<br />		modalForWindow:window&nbsp; // IBOutlet NSWindow *window; dans la déclaration d&#39;interface<br />		 modalDelegate:self<br />		didEndSelector:@selector(endSel)&nbsp;  // La méthode appelée à  la fermeture de la sheet<br />			contextInfo:NULL];&nbsp;  //&nbsp; Non utilisé la<br />	[NSApp runModalForWindow:sheet];<br />	[NSApp endSheet:sheet];<br />	[sheet orderOut:self];<br />}<br /><br />- (IBAction)closeSheet:(id)sender<br />{<br />	[NSApp stopModal];&nbsp;  // L&#39;application ferme la fenê^tre modale au premier plan<br />}<br /><br />- (void)endSel<br />{<br />	//NSLog(@&quot;&#092;nend of sheet&quot;);&nbsp;  // On peut faire afficher l&#39;action dans le Run Log<br />	&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // mais on ne l&#39;utilisera pas<br />}<br /><br />/**<br />&nbsp; &nbsp; Returns the support folder for the application, used to store the Core Data<br />&nbsp; &nbsp; store file.&nbsp; This code uses a folder named &quot;CodeEnStock&quot; for<br />&nbsp; &nbsp; the content, either in the NSApplicationSupportDirectory location or (if the<br />&nbsp; &nbsp; former cannot be found), the system&#39;s temporary directory.<br /> */<br /><br />- (NSString *)applicationSupportFolder {<br /><br />&nbsp; &nbsp; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSApplicationSupportDirectory, NSUserDomainMask, YES);<br />&nbsp; &nbsp; NSString *basePath = ([paths count] &gt; 0) ? [paths objectAtIndex:0] : NSTemporaryDirectory();<br />&nbsp; &nbsp; return [basePath stringByAppendingPathComponent:@&quot;CodeEnStock&quot;];<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Creates, retains, and returns the managed object model for the application <br />&nbsp; &nbsp; by merging all of the models found in the application bundle and all of the <br />&nbsp; &nbsp; framework bundles.<br /> */<br /> <br />- (NSManagedObjectModel *)managedObjectModel {<br /><br />&nbsp; &nbsp; if (managedObjectModel != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return managedObjectModel;<br />&nbsp; &nbsp; }<br />	<br />&nbsp; &nbsp; NSMutableSet *allBundles = [[NSMutableSet alloc] init];<br />&nbsp; &nbsp; [allBundles addObject: [NSBundle mainBundle]];<br />&nbsp; &nbsp; [allBundles addObjectsFromArray: [NSBundle allFrameworks]];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles: [allBundles allObjects]] retain];<br />&nbsp; &nbsp; [allBundles release];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return managedObjectModel;<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Returns the persistent store coordinator for the application.&nbsp; This <br />&nbsp; &nbsp; implementation will create and return a coordinator, having added the <br />&nbsp; &nbsp; store for the application to it.&nbsp; (The folder for the store is created, <br />&nbsp; &nbsp; if necessary.)<br /> */<br /><br />- (NSPersistentStoreCoordinator *) persistentStoreCoordinator {<br /><br />&nbsp; &nbsp; if (persistentStoreCoordinator != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return persistentStoreCoordinator;<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; NSFileManager *fileManager;<br />&nbsp; &nbsp; NSString *applicationSupportFolder = nil;<br />&nbsp; &nbsp; NSURL *url;<br />&nbsp; &nbsp; NSError *error;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; fileManager = [NSFileManager defaultManager];<br />&nbsp; &nbsp; applicationSupportFolder = [self applicationSupportFolder];<br />&nbsp; &nbsp; if ( ![fileManager fileExistsAtPath:applicationSupportFolder isDirectory:NULL] ) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [fileManager createDirectoryAtPath:applicationSupportFolder attributes:nil];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; url = [NSURL fileURLWithPath: [applicationSupportFolder stringByAppendingPathComponent: @&quot;CodeEnStock.xml&quot;]];<br />&nbsp; &nbsp; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];<br />&nbsp; &nbsp; if (![persistentStoreCoordinator addPersistentStoreWithType:NSXMLStoreType configuration:nil URL:url options:nil error:&amp;error]){<br />&nbsp; &nbsp; &nbsp; &nbsp; [[NSApplication sharedApplication] presentError:error];<br />&nbsp; &nbsp; }&nbsp; &nbsp; <br /><br />&nbsp; &nbsp; return persistentStoreCoordinator;<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Returns the managed object context for the application (which is already<br />&nbsp; &nbsp; bound to the persistent store coordinator for the application.) <br /> */<br /> <br />- (NSManagedObjectContext *) managedObjectContext {<br /><br />&nbsp; &nbsp; if (managedObjectContext != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; return managedObjectContext;<br />&nbsp; &nbsp; }<br /><br />&nbsp; &nbsp; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];<br />&nbsp; &nbsp; if (coordinator != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; managedObjectContext = [[NSManagedObjectContext alloc] init];<br />&nbsp; &nbsp; &nbsp; &nbsp; [managedObjectContext setPersistentStoreCoordinator: coordinator];<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return managedObjectContext;<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Returns the NSUndoManager for the application.&nbsp; In this case, the manager<br />&nbsp; &nbsp; returned is that of the managed object context for the application.<br /> */<br /> <br />- (NSUndoManager *)windowWillReturnUndoManager:(NSWindow *)window {<br />&nbsp; &nbsp; return [[self managedObjectContext] undoManager];<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Performs the save action for the application, which is to send the save:<br />&nbsp; &nbsp; message to the application&#39;s managed object context.&nbsp; Any encountered errors<br />&nbsp; &nbsp; are presented to the user.<br /> */<br /> <br />- (IBAction) saveAction:(id)sender {<br /><br />&nbsp; &nbsp; NSError *error = nil;<br />&nbsp; &nbsp; if (![[self managedObjectContext] save:&amp;error]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; [[NSApplication sharedApplication] presentError:error];<br />&nbsp; &nbsp; }<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Implementation of the applicationShouldTerminate: method, used here to<br />&nbsp; &nbsp; handle the saving of changes in the application managed object context<br />&nbsp; &nbsp; before the application terminates.<br /> */<br /> <br />- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender {<br /><br />&nbsp; &nbsp; NSError *error;<br />&nbsp; &nbsp; int reply = NSTerminateNow;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; if (managedObjectContext != nil) {<br />&nbsp; &nbsp; &nbsp; &nbsp; if ([managedObjectContext commitEditing]) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if ([managedObjectContext hasChanges] &amp;&amp; ![managedObjectContext save:&amp;error]) {<br />				<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // This error handling simply presents error information in a panel with an <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // &quot;Ok&quot; button, which does not include any attempt at error recovery (meaning, <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // attempting to fix the error.)&nbsp; As a result, this implementation will <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // present the information to the user and then follow up with a panel asking <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // if the user wishes to &quot;Quit Anyway&quot;, without saving the changes.<br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // Typically, this process should be altered to include application-specific <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; // recovery steps.&nbsp; <br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; BOOL errorResult = [[NSApplication sharedApplication] presentError:error];<br />				<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (errorResult == YES) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reply = NSTerminateCancel;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; } <br /><br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else {<br />					<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; int alertReturn = NSRunAlertPanel(nil, @&quot;Could not save changes while quitting. Quit anyway?&quot; , @&quot;Quit anyway&quot;, @&quot;Cancel&quot;, nil);<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if (alertReturn == NSAlertAlternateReturn) {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reply = NSTerminateCancel;	<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; } <br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; else {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; reply = NSTerminateCancel;<br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return reply;<br />}<br /><br /><br />/**<br />&nbsp; &nbsp; Implementation of dealloc, to release the retained variables.<br /> */<br /> <br />- (void) dealloc {<br /><br />&nbsp; &nbsp; [managedObjectContext release], managedObjectContext = nil;<br />&nbsp; &nbsp; [persistentStoreCoordinator release], persistentStoreCoordinator = nil;<br />&nbsp; &nbsp; [managedObjectModel release], managedObjectModel = nil;<br />&nbsp; &nbsp; [super dealloc];<br />}<br /><br /><br />@end<br /><br />
    


    C'est quand même énervant de ne pas voir ses erreurs...
    :why?:
  • Philippe49Philippe49 Membre
    23:52 modifié #25
    L'implémentation de la méthode ne doit pas être dans l'interface (le .h) mais dans le .m
  • stounfrstounfr Membre
    23:52 modifié #26
    Ok merci encore, c'est bon ca fonctionne...
    Et en plus j'ai compris 
  • stounfrstounfr Membre
    23:52 modifié #27
    Bon, j'avance petit à  petit (dur dur de faire cohabiter travail et passion), mais je suis bloqué sur la barre d'outils

    j'ai une erreur :

    CodeEnStock_AppDelegate.m:50: fatal error: method definition not in @implementation context

    Pour le code :

    <br />	[theDict setObject:item forKey:identifier];<br />}<br /><br />// méthode trouvée dans les exemples APPLE<br /><br />// This methode is required of NSToolbar delegates. It takes an identifier, and returns the matching NSToolbarItem.<br />// It also takes a parameter telling whether this toolbar item is going into an actual toolbar, or whether it&#39;s<br />// going to be displayed in a customization palette.<br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />// We create and autorelease a new NSToolbarItem, and then go through the process of setting up its<br />// attributes from the master toolbar item matching that identifier in our dictionary of items.<br />	NSToolbarItem *newItem = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];<br />	NSToolbarItem *item=[toolbarItems objectForKey:itemIdentifier];<br />	<br />	[newItem setLabel:[item label]];<br />	[newItem setPaletteLabel:[item paletteLabel]];<br />	if ([item view]!=NULL)<br />	{<br />		[newItem setView:[item view]];<br />	}<br />	else<br />	{<br />		[newItem setImage:[item image]];<br />	}<br />	[newItem setToolTip:[item toolTip]];<br />	[newItem setTarget:[item target]];<br />	[newItem setAction:[item action]];<br />	[newItem setMenuFormRepresentation:[item menuFormRepresentation]];<br />	// If we have a custom view, we *have* to set the min/max size - otherwise, it&#39;ll default to 0,0 and the custom<br />	// view won&#39;t show up at all! This doesn&#39;t affect toolbar items with images, however.<br />	if ([newItem view]!=NULL)<br />	{<br />		[newItem setMinSize:[[item view] bounds].size];<br />		[newItem setMaxSize:[[item view] bounds].size];<br />	}<br />	<br />	return newItem;<br />}<br />
    

    et plus précisement les lignes :

    <br />- (NSToolbarItem *)toolbar:(NSToolbar *)toolbar itemForItemIdentifier:(NSString *)itemIdentifier willBeInsertedIntoToolbar:(BOOL)flag<br />{<br />// We create and autorelease a new NSToolbarItem, and then go through the process of setting up its<br />// attributes from the master toolbar item matching that identifier in our dictionary of items.<br />	NSToolbarItem *newItem = [[[NSToolbarItem alloc] initWithItemIdentifier:itemIdentifier] autorelease];<br />
    


    l'erreur apparaà®t au niveau de l'ouverture du crochet "{"
  • Philippe49Philippe49 Membre
    23:52 modifié #28
    dans 1213129089:

    j'ai une erreur :
    CodeEnStock_AppDelegate.m:50: fatal error: method definition not in @implementation context

    Le message est clair :
    method definition not in @implementation context
    La méthode n'est pas là  où il faut , entre

    @implementation CodeEnStock_AppDelegate
              et
    @end


    Peut-être le @end n'existe pas, où n'est pas lue à  cause d'une accolade, d'une parenthèse, d'un point-virgule en trop ou en pas assez.

  • stounfrstounfr Membre
    23:52 modifié #29
    Ok, j'aivais déjà  essayer mais je pensais que ce n'étais pas ca car lorsque je fais mon build, j'ai 1 avertissement :

    CodeEnStock_AppDelegate.m:36: warning: 'NSMenuItem' may not respond to '-setMenuFormRepresentation:'

    mais ca fonctionne...
    Encore merci...
  • Philippe49Philippe49 Membre
    23:52 modifié #30
    dans 1213133917:

    CodeEnStock_AppDelegate.m:36: warning: 'NSMenuItem' may not respond to '-setMenuFormRepresentation:'


    setMenuFormRepresentation  --> setMenuFromRepresentation
  • Paisible.frPaisible.fr Membre
    23:52 modifié #31
    dans 1208629771:

    "The managed object model version used to open the persistent store is incompatible with the one that was used to create the persistent store"


    Lorsque l'on modifie le data model, en ajoutant une entity ou un attribut, le plus souvent cela se passe sans problème.
    Mais quand on en supprime une/un, ou que l'on en modifie le type, le genre de message cité ci-dessus apparaà®t, pour signaler que la structure du data model ne correspond pas à  celle décrite dans le "store", fichier de la base de données enregistré là  par défaut : /Users/moncompte/Bibliotheque/Applications Support/MonAppli/MonAppli.xml.
    Il peut être mécontent à  l'ouverture de l'appli, ou lors de la sauvegarde automatique lors de la fermeture.
    Pendant la création de l'appli, à  chaque modification de structure, il vaut mieux supprimer le fichier MonAppli.xml (ou .sql, selon votre choix de base de données). Il s'en crée un nouveau, correspondant à  la nouvelle structure, mais vide de données!!!.
    Il vaut mieux attendre la fin de la mise au point de la structure avant de rentrer beaucoup de données, ou alors se créer dès le début, un importateur/exportateur indépendant de la structure (important des fichiers texte du format TTR par exemple).


    Ok, mais ne serait il pas possible d'automatiser cet effacement à  chaque build par un moyen ou un autre... ?
Connectez-vous ou Inscrivez-vous pour répondre.