2010-11-19 36 views
0

J'ai quelques questions auxquelles j'essaie de répondre moi-même (en cherchant dans la documentation) mais j'ai le sentiment qu'il me manque quelque chose.Application Core Data Document-based: comment modéliser et contrôler une entité qui est instanciée une seule fois par document?

Tous les conseils (et/ou les pointeurs vers la documentation appropriée) seraient très appréciés.

Je construis une application basée sur des documents Core Data. Il existe essentiellement deux entités:

Il existe un seul enregistrement "Comparaison" associé à chaque document. Il existe potentiellement de nombreux enregistrements "Node" associés à chaque document.

Ma première question est de savoir si j'y pense correctement. Comme il n'y a qu'un seul objet de comparaison pour chaque document, les attributs de la comparaison sont essentiellement des attributs du document lui-même. Quel (le cas échéant) est le moyen préféré de modéliser cela?

Si une entité de comparaison est en fait la bonne façon de procéder, ma prochaine question est de savoir comment et quand instancier réellement l'objet de comparaison (unique). L'utilisateur ne devrait pas avoir à "ajouter" explicitement la comparaison car il n'y en aura qu'une seule associée au document. Au lieu de cela, un seul objet de comparaison doit être instancié et inséré dans le managedObjectContext. J'ai quelque chose comme ça travail déjà, avec le code dans MyDocument.m qui ressemble à ceci:

  • (void) windowControllerDidLoadNib: (NSWindowController *) {windowController [super windowControllerDidLoadNib: windowController]; [NSEntityDescription insertNewObjectForEntityForName: @ "Comparaison" inManagedObjectContext: managedObjectContext]; }

Cependant - si l'utilisateur crée un nouveau document, mais ne puis jamais travailler avec elle - par exemple s'il clique immédiatement le bouton de fermeture - il ne devrait pas être invité à « sauver » le document. Il devrait être invité à sauvegarder son travail seulement s'il a effectivement entré des informations. Y a-t-il un moyen préféré d'implémenter ce comportement?

Répondre

0

Je n'ai pas inséré correctement cet extrait de code dans le message d'origine. Une nouvelle tentative:

-(void)windowControllerDidLoadNib:(NSWindowController *)windowController { 
    [super windowControllerDidLoadNib:windowController]; 
    [NSEntityDescription insertNewObjectForEntityForName:@"Comparison" inManagedObjectContext:managedObjectContext]; 
} 
0

Votre question sur la modélisation est pas très claire, pouvez-vous s'il vous plaît expliquer ce que votre entité « comparaison » est censé faire et quel genre d'attributs que vous lui assigner? Il serait utile de voir votre structure d'entité "Document" afin que nous puissions fournir une contribution utile.

En ce qui concerne votre deuxième question, vous pouvez vérifier si votre NSManagedObject a été mis à jour avant de décider de demander à l'utilisateur d'enregistrer son document ou non:

if ([documentObject isUpdated]) { 
... 
} 

Plus de détails dans la documentation ici http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/cl/NSManagedObject

Cheers, Rog

0

Il n'y a pas vraiment une entité « document », je simplement utiliser ce terme pour désigner l'ensemble du document qui est enregistré lorsque l'utilisateur appelle la Sa élément de menu ve. Peut-être qu'il existe une meilleure façon de se référer à ce concept? NSPersistentDocument?

Sauvegarde un peu ...l'idée centrale de l'application est de comparer deux structures de répertoires hiérarchiques (un «diff» visuel récursif). Pour l'instant, l'entité "Comparaison" a deux attributs de chaîne, pathA et pathB, qui sont les noms des deux répertoires à comparer. Chaque entité "Node" représente le nom d'un fichier dans les arborescences de répertoires comparées. L'entité Node contient au moins un attribut ("relativePath") qui est le chemin relatif au point de départ spécifié dans la comparaison. Ma première question était simplement de savoir s'il est logique qu'il y ait une entité "Comparaison" car il n'y en aura qu'une instanciée (à un certain moment après que l'utilisateur ait appelé l'élément de menu "Nouveau").

La deuxième question est vraiment de savoir à quel moment l'unique objet "Comparison" doit être instancié et inséré dans le managedObjectContext, c'est-à-dire quelle est la méthode la plus appropriée pour que cela se produise?

Enfin, si un objet "Comparison" est automatiquement instancié (au moment de awakeFromNib, peut-être?) Mais que l'utilisateur décide de ne pas continuer et clique simplement sur le bouton de fermeture, il ne devrait pas être sauvegardé. être le moyen approprié pour accomplir ceci? Le documentObject semble avoir été mis à jour, car un objet de comparaison "vide" a en fait déjà été inséré automatiquement au démarrage, mais l'utilisateur ne l'a pas modifié.

Espérons que c'est clair ... merci.

1

J'ai trouvé ce fil tout en luttant avec le même problème. J'ai une table de Entity_A fonctionnant dans mon application de base de données de document, mais je dois comprendre comment traiter une seule instance requise par document de Entity_B.

J'ai trouvé quelque chose qui semble fonctionner. Il y a probablement un meilleur moyen, mais cela me permet de surmonter cet obstacle pour l'instant.

Lorsque le xib du document est chargé, je vérifie simplement si une Entity_B a été créée. sinon, j'en crée un et initialise ses attributs.

- (void)windowControllerDidLoadNib:(NSWindowController *)aController 
    { 
     [super windowControllerDidLoadNib:aController]; 

     //has an Entity_B been created? if not, create one. 
     NSError *theError = nil; 
     NSUInteger count = [[self managedObjectContext] countForFetchRequest:[NSFetchRequest fetchRequestWithEntityName:@"Entity_B"] error:&theError]; 

     if(count == 0) 
     { 
      NSManagedObject *newEntity_B = [NSEntityDescription insertNewObjectForEntityForName:@"Entity_B" inManagedObjectContext:[self managedObjectContext]]; 

      [newEntity_B setValue:[NSNumber numberWithBool:YES] forKey:@"boolAttribute"]; 
      [newEntity_B setValue:[NSNumber numberWithInt:2] forKey:@"intAttribute"]; 
     } 
    }