0

Ich weiß, das ist ziemlich lang, aber ich arbeite derzeit an meinem ersten CoreData-Projekt und trotz Lesen jeder Ressource kann ich finden, es ist einfach nicht alle sinken noch in. Bis jetzt habe ich es sparen und beharrlich alles in Ordnung, aber ich kann nicht scheinen, um die Beziehung richtig funktionieren zu lassen. Ich habe eine Tabellenansicht, die "Extensize Categorys" anzeigt, die in eine Tabelle verschoben wird, in der die zugehörigen Exersizes (Eins-zu-Viele) angezeigt werden.CoreData: One-to-Many Beziehung Anzeige Problem

(versucht, ein Bild zu schreiben, aber ich habe noch nicht genug rep Punkte), aber das Datenmodell sieht wie folgt aus

ExersizeCategory < --- >> exersize

von allem, was ich gelesen habe Ich glaube, dass ich ein Prädikat verwenden muss, um die Ergebnisse zu filtern, aber ich bin verwirrt darüber, wie das tatsächlich funktioniert und Wetter oder nicht Ich bin tatsächlich sogar Erstellen und Speichern der Exesize-Categorys und Exersizes Objekte geeignet für die Beziehung zu arbeiten an erster Stelle.

Hier ist, wie ich das Erstellen und Speichern

ExersizeCategory *exersizeCategory = [NSEntityDescription insertNewObjectForEntityForName:@"ExersizeCategory" 
                     inManagedObjectContext:self.managedObjectContext]; 
    exersizeCategory.name = self.textField.text; 

    [self.managedObjectContext save:nil]; // write to database 

(auch seinen Namen in das Textfeld ein Eintrag Einstellung) Und hier ist der Code für die exersizes (ziemlich identisch)

// Create a new instance of the entity 
    exersize = [NSEntityDescription insertNewObjectForEntityForName:@"Exersize" 
              inManagedObjectContext:self.managedObjectContext]; 

    exersize.name = self.textField.text; 

    [self.managedObjectContext save:nil]; // write to database 

Obwohl Das scheint beim Erstellen der Objekte zu funktionieren und ich sehe sie auf den Tabellenansichten, die ich noch nicht implementiert habe. Wie und wo passen diese in das Bild?

@interface ExersizeCategory (CoreDataGeneratedAccessors) 
  • (void) addExersizesObject: (exersize *) Wert ist;
  • (void) removeExersizesObject: (Exersize *) Wert;
  • (void) addExersizes: (NSSet *) Werte;
  • (void) removeExersizes: (NSSet *) Werte;

Ich sollte erwähnen, dass ich die CoreDataTableViewController Klasse bin mit dem Sie die Menge an Code zu reduzieren scheint müssen zu holen schreiben (was ich durch ein Tutorial fand ich bei www.timroadly.com durchlaufen wurde) erstellt von Stanford University. Randbemerkung: Wäre es besser, nicht subclass dies und nur den Standard Weg zu verwenden, wie ich in der .h bemerkte es seine urheberrechtlich geschützten Stanford, so dass ich nicht sicher bin, ob ich es in einer App, die ich veröffentlichen kann, verwenden kann ?

Hier ist, wie ich zur Zeit Abrufen der Exersizes

- (void)setupFetchedResultsController { 
// 1 - Decide what Entity you want 
NSString *entityName = @"Exersize"; // Put your entity name here 
NSLog(@"Setting up a Fetched Results Controller for the Entity named %@", entityName); 

// 2 - Request that Entity 
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:entityName]; 

// 3 - Filter it if you want 

//currently unsure about this! 
//request.predicate = [NSPredicate predicateWithFormat:@""]; 

// 4 - Sort it if you want 
request.sortDescriptors = [NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" 
                       ascending:YES 
                        selector:@selector(localizedCaseInsensitiveCompare:)]]; 
// 5 - Fetch it 
self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request 
                    managedObjectContext:self.managedObjectContext 
                     sectionNameKeyPath:nil 
                       cacheName:nil]; 
[self performFetch]; 

}

Ich habe ich kenne anzuzeigen wichtige Stücke verpasst diese bei der Umsetzung, aber ich bin nur nicht sicher, welche und wo. Ich war erst seit ein paar Tagen bei den Kerndaten, also war es ziemlich schwer zu lernen!

Vielen Dank an alle, die Licht/Antwort/oder sogar drücken Sie mich in die richtige Richtung!

Antwort

0

f.Verderbens,

Sie schreiben:

Obwohl dies bei der Schaffung der Objekte zu funktionieren scheint und ich sehe sie auf dem Tableviews i noch die coreDataGeneratedAccessors umsetzen müssen, wie und wo diese passen in die bild?

Core Data erstellt dynamisch die Implementierungen dieser Methoden. Die Header sind für Ihre Bequemlichkeit und Complier Typ Überprüfung.

Hier ist ein einfaches Prädikat eine Übung Namen auf Ihre exersize Unternehmen zu finden:

NSPredicate *p = [NSPredicate predicateWithFormat: @"%K == %@", @"name", @"Push Up"]; 

Andrew

P. S. Möglicherweise möchten Sie Ihre Schreibweise der Wortübung korrigieren.

+0

hallo andrew guten schrei auf die buchung, aber krank halten sie die gleiche nur für den moment der konsistenz halber. Nachdem ich ein paar mehr Dinge versucht habe und ein bisschen mehr gelesen habe, glaube ich, dass ich es richtig abrufen kann, aber wenn ich das exersize-Objekt erstelle, kann ich es nicht in die Beziehung einfügen, da die NSSet-Zählung für exersizes bei 0 bleibt habe versucht [exersizeCategory addExersizesObject: exersize]; aber das scheint nicht zu funktionieren? Ich habe alle Lösungen ausprobiert, die ich finden konnte, aber ich gehe immer noch irgendwo daneben, scheint dir irgendetwas offensichtlich falsch zu sein? danke nochmal –

+0

f.pedition, Jede CD Beziehung hat eine inverse. Wenn also die Beziehung Eins-zu-Viele ist und die Inverse eins zu eins ist, dann kann die Beziehung durch eine einfache Zuweisung aufgebaut werden. Wie in: 'Übung.Ausübungen = Übungen;'. Andrew – adonoho

+0

Andrew, ich kann nicht scheinen, dass das funktioniert, das gleiche Problem wie zuvor. Die exerciseCategory-Objekte werden erstellt und angezeigt, wie sie es sollten, jedoch die Übungen selbst arnt. Durch print-Anweisungen kann ich sehen, dass der Kontext des verwalteten Objekts weitergegeben wird und etwas erstellt wird, aber das NSSet bleibt leer und auch die Tabellenansicht Ich nehme an, dass es nichts bekommen hat, weil es zugehörige Einträge abgerufen und nichts hinzugefügt hat holen. irgendwelche Ideen, was könnte passieren? Ich könnte meinen Beitrag aktualisieren, um mehr Code zu zeigen, wenn es der Situation hilft? Prost Mann! –

Verwandte Themen