2010-11-19 10 views
0

Ich habe ein paar Fragen, die ich für mich selbst beantworten wollte (indem ich die Dokumentation durchforste), aber ich habe das Gefühl, dass mir etwas fehlt.Document-based Anwendung für Kerndaten: Wie modelliere und kontrolliere ich eine Entität, die nur einmal pro Dokument instanziiert wird?

Alle Hinweise (und/oder Hinweise auf entsprechende Dokumentation) wären sehr willkommen.

Ich baue eine dokumentenbasierte Anwendung auf Basis von Kerndaten. Es gibt im Wesentlichen zwei Entitäten:

Es gibt einen einzelnen "Vergleich" Datensatz, der jedem Dokument zugeordnet ist. Zu jedem Dokument sind möglicherweise viele "Node" -Sätze vorhanden.

Meine erste Frage ist, ob ich richtig darüber nachdenke. Da es für jedes Dokument nur ein Vergleichsobjekt gibt, sind die Attribute des Vergleichs im Wesentlichen Attribute des Dokuments selbst. Was (wenn überhaupt) ist der bevorzugte Weg, dies zu modellieren?

Wenn eine Vergleichsentität tatsächlich der richtige Weg ist, lautet meine nächste Frage, wie und wann das (einzelne) Vergleichsobjekt tatsächlich instanziiert werden soll. Der Benutzer sollte den Vergleich nicht explizit "hinzufügen" müssen, da nur einer von ihnen dem Dokument zugeordnet ist. Stattdessen sollte ein einzelnes Vergleichsobjekt instanziiert und in den managedObjectContext eingefügt werden. Ich habe so etwas wie dieses Arbeits bekam bereits mit Code in MyDocument.m die wie folgt aussieht:

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

jedoch - wenn der Benutzer ein neues Dokument erstellt, aber dann hat nie mit ihm arbeiten - zum Beispiel, wenn er klickt sofort die Schließen-Schaltfläche - dann sollte er nicht aufgefordert werden, die auf „Speicher“ Dokument. Er sollte gebeten werden, seine Arbeit nur zu speichern, wenn er tatsächlich irgendwelche Informationen eingegeben hat. Gibt es eine bevorzugte Möglichkeit, dieses Verhalten zu implementieren?

Antwort

0

Ich habe das Code-Snippet nicht korrekt in den ursprünglichen Post eingefügt. Erneuter Versuch:

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

Ihre Frage über das Modellieren nicht ganz klar ist, können Sie bitte näher ausführen, was Ihre „Vergleich“ entity tun soll und welche Art von Attributen, die Sie ihm zuweisen? Es wäre praktisch, Ihre Entitätsstruktur "Dokument" zu sehen, damit wir Ihnen nützliche Informationen liefern können.

Mit Bezug auf Ihre zweite Frage, können Sie überprüfen, ob Ihr NSManagedObject vor der Entscheidung über aktualisiert wurde, ob den Benutzer aufzufordern, ihr Dokument zu speichern oder nicht:

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

Weitere Details in der Dokumentation hier http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/CoreDataFramework/Classes/NSManagedObject_Class/Reference/NSManagedObject.html#//apple_ref/occ/cl/NSManagedObject

Cheers, Rog

0

Es ist nicht wirklich eine „Dokument“ Entität ist, wurde mit mir einfach diesem Begriff auf das gesamte Dokument beziehen, die gespeichert wird, wenn der Benutzer den Sa ruft Menüpunkt. Vielleicht gibt es einen besseren Weg, auf dieses Konzept zu verweisen? NSPersistentDocument?

Sicher ein wenig ...Die zentrale Idee der Anwendung besteht darin, zwei hierarchische Verzeichnisstrukturen zu vergleichen (ein visuelles rekursives "diff").

Momentan hat die Entität "Comparison" zwei String-Attribute, pathA und pathB, die die Namen der beiden zu vergleichenden Verzeichnisse sind. Jede "Node" -Entität repräsentiert den Namen einer Datei in den Verzeichnisbäumen, die verglichen werden. Die Node-Entität enthält mindestens ein Attribut ("relativerPfad"), bei dem es sich um den Pfad relativ zum im Vergleich angegebenen Startpunkt handelt.

Meine erste Frage war einfach, ob es sinnvoll ist, eine Entität "Vergleich" zu haben, da nur eine davon instanziiert sein wird (irgendwann nachdem der Benutzer den Menüpunkt "Neu" aufgerufen hat). Die zweite Frage ist eigentlich, an welchem ​​Punkt das einzelne "Comparison" -Objekt instanziiert und in den managedObjectContext eingefügt werden soll, d. H. Welche Methode ist am geeignetsten, um dies zu erreichen?

Schließlich, wenn ein "Vergleich" -Objekt automatisch instanziiert wird (bei watchFromNib, vielleicht?), Aber der Benutzer entscheidet, nicht fortzufahren, und klickt einfach auf die Schaltfläche schließen, sollte er nicht aufgefordert werden zu speichern (richtig?) Was würde der geeignete Weg sein, dies zu erreichen? Das documentObject scheint aktualisiert worden zu sein, da ein "leeres" Vergleichsobjekt tatsächlich beim Start automatisch eingefügt wurde, aber der Benutzer es nicht geändert hat.

Hoffe, das ist klar ... danke.

1

Ich fand diesen Thread während mit dem gleichen Problem kämpfen. Ich habe eine Tabelle mit Entity_A, die in meiner dokumentbasierten Core Data-App funktioniert, aber ich muss herausfinden, wie eine erforderliche Einzelinstanz pro Dokument von Entity_B gehandhabt wird.

Ich habe etwas gefunden, das zu funktionieren scheint. Es gibt wahrscheinlich einen besseren Weg, aber das bringt mich jetzt über diese Hürde.

Wenn das Xib des Dokuments geladen wird, überprüfe ich einfach, ob eine Entity_B erstellt wurde. Wenn nicht, erstelle ich einen und initialisiere seine Attribute.

- (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"]; 
     } 
    }