2009-05-27 4 views
0

***** EDITER ***** Ce dont je ne suis pas sûr, c'est comment accéder à une entité à partir du modèle dans le code, et comment accéder à une instance spécifique d'une entité dans ce code. Cela résume les principaux problèmes que j'ai.Ajouter à arrayController, modifier l'attribut Core Data

***** FIN EDIT *****

J'ai un tableview avec un bouton pour ajouter. Lorsque le bouton est cliqué, l'utilisateur se voit présenter une boîte de dialogue ouverte dans laquelle il sélectionne un ou plusieurs fichiers. Un nouvel objet est ajouté au contrôleur de tableau. Ce que je ne suis pas sûr comment faire est de modifier les attributs de données de base pour ce nouvel objet. Il y a deux attributs, filename et pathname, et je ne sais pas comment les éditer. Si vous regardez le bas de la fonction openPanelDidEnd: returnCode: contextInfo: vous verrez ce que j'essaie d'accomplir.

- (IBAction)addAttachment:(id)sender 
{ 
    panel = [NSOpenPanel openPanel]; 
    [panel beginSheetForDirectory:nil 
       file:nil 
       modalForWindow:[NSApp mainWindow] 
      modalDelegate:self 
      didEndSelector:@selector(openPanelDidEnd: 
          returnCode: 
          contextInfo:) 
       contextInfo:NULL]; 
} 

- (void)openPanelDidEnd:(NSOpenPanel *)openPanel 
      returnCode:(int)returnCode 
      contextInfo:(void *)x 
{ 
    if (returnCode == NSOKButton) 
    { 
     NSArray *files = [openPanel filenames]; 

     int i; 
     for (i = 0; i < [files count]; i++) 
     { 
      NSString *file = [files objectAtIndex:i]; 
      [attachmentController add:x]; 
      // How do I add filenames here? 
      // I'm assuming it involves KVC like 
      // [something setValue:@"file" forKey:@"filename"]; 
      // But I don't know hot to get the something 
      // i.e. since I have multiple attachments, 
      // how do I get the one I just created 
     } 
    } 
} 

*********** EDITER ************** simplifié, mon modèle dispose de 2 entités: Pièce jointe et article. L'article a une relation à plusieurs avec l'attachement, car chaque objet peut avoir plusieurs attachements.

Mon openPanelDidEnd: returnCode: contextInfo: méthode ressemble maintenant à ceci:

 NSString *filename = [files objectAtIndex:i]; 
     MySchoolPlanner_AppDelegate *myAppDelegate = [[MySchoolPlanner_AppDelegate init] alloc]; 
     [NSEntityDescription insertNewObjectForEntityForName:@"Attachment" 
             inManagedObjectContext:[myAppDelegate managedObjectContext]]; 
     [myAppDelegate release]; 

Pour une raison quelconque, la vue de table lié au contrôleur RAID de fixation n'ajoute pas. En outre, je ne suis pas sûr comment accéder à la pièce jointe que je viens de créer pour utiliser KVC dessus.

Répondre

2

La méthode add: de NSArray est quelque chose à laquelle vous pouvez attacher un bouton, lorsque vous avez une entité de base de données qui peut être créée et utilisée sans initialisation. Dans ce cas, il suffit d'appeler

de NSEntityDescription
+ (id)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context 

avec le contexte de l'objet géré que vous utilisez avec votre contrôleur RAID et le nom de l'entité appropriée pour créer votre objet géré dans le code. Vous pouvez définir directement les propriétés si vous avez créé une sous-classe pour votre entité, ou simplement utiliser le codage de valeur de clé si vous ne l'avez pas encore fait.

+0

Merci pour l'aide, mais je suis encore un peu confus. Voir ma modification. Merci! – Walker

+1

Eh bien, dans votre code, vous créez un contrôleur d'application entièrement nouveau, avec soit un second contexte MO ou nul, et détruisez-le ensuite. C'est un peu en arrière, puisque vous avez déjà un contexte existant à utiliser. Si j'étais à votre place, je mettrais les données de base en attente jusqu'à ce que vous ayez eu l'occasion de vous familiariser avec le framework Cocoa et les motifs de design qu'il utilise. Core Data rend les choses faciles à certains égards, mais il n'est pas destiné à remplacer les bases. –

+0

Je sais que je suis probablement dans la tête, mais j'ai construit une application basée sur les données de base, mais avec la plupart des choses de base de données effectuées dans IB. Je prévois de me familiariser beaucoup avec Core Data dans un avenir proche, mais j'aimerais que celui-ci soit résolu dès maintenant. Merci pour votre aide, cependant. Je ne sais pas exactement comment accéder à une entité à partir du modèle dans le code et comment accéder à une instance spécifique d'une entité dans ce code. – Walker

Questions connexes