Ich lade meine App mit einer Eigenschaftsliste von Daten von einer Website. Diese Eigenschaftslistendatei enthält ein NSArray von NSDictionaries, das selbst ein NSArray von NSDictionaries enthält. Im Grunde versuche ich einen TableView der Restaurantmenükategorien zu laden, von denen jedes Menüpunkte enthält.So speichern Sie ein Array von NSManagedObjects in einem NSManagedObject
Meine Eigenschaftslistendatei ist in Ordnung. Ich bin in der Lage, die Datei zu laden und durch die Knotenstruktur zu scrollen, indem ich NSEntityDescriptions erstelle und in Core Data speichern kann. Alles funktioniert gut und erwartet, außer dass in meinem Menü Kategorie verwaltetes Objekt, habe ich eine NSArray von Menüelementen für diese Kategorie. Später, wenn ich die Kategorien hole, sind die Zeiger auf die Menüpunkte in einer Kategorie verloren und ich bekomme alle Menüpunkte. Soll ich Prädikate verwenden oder verfolgen Core Data meinen Objektgraphen für mich?
Kann jemand sehen, wie ich Core Data lade und den Fehler in meiner Logik aufzeige? Ich bin ziemlich gut mit entweder SQL und OOP selbst, bin aber etwas verwirrt von ORM. Ich dachte, dass ich nur Aggregation in meinen verwalteten Objekten verwenden könnte und dass das Framework die Zeiger für mich verfolgen würde, aber anscheinend nicht.
NSError *error;
NSURL *url = [NSURL URLWithString:@"http://foo.com"];
NSArray *categories = [[NSArray alloc] initWithContentsOfURL:url];
NSMutableArray *menuCategories = [[NSMutableArray alloc] init];
for (int i=0; i<[categories count]; i++){
MenuCategory *menuCategory = [NSEntityDescription
insertNewObjectForEntityForName:@"MenuCategory"
inManagedObjectContext:[self managedObjectContext]];
NSDictionary *category = [categories objectAtIndex:i];
menuCategory.name = [category objectForKey:@"name"];
NSArray *items = [category objectForKey:@"items"];
NSMutableArray *menuItems = [[NSMutableArray alloc] init];
for (int j=0; j<[items count]; j++){
MenuItem *menuItem = [NSEntityDescription
insertNewObjectForEntityForName:@"MenuItem"
inManagedObjectContext:[self managedObjectContext]];
NSDictionary *item = [items objectAtIndex:j];
menuItem.name = [item objectForKey:@"name"];
menuItem.price = [item objectForKey:@"price"];
menuItem.image = [item objectForKey:@"image"];
menuItem.details = [item objectForKey:@"details"];
[menuItems addObject:menuItem];
}
[menuCategory setValue:menuItems forKey:@"menuItems"];
[menuCategories addObject:menuCategory];
[menuItems release];
}
if (![[self managedObjectContext] save:&error]) {
NSLog(@"An error occurred: %@", [error localizedDescription]);
}
Ich bin mir nicht sicher, ob ich eine sortIndex Eigenschaft hinzufügen möchte, da dies gegen den ganzen Punkt von ORM geht, oder es sollte. In Java zum Beispiel, wenn ich ein Objekt zu einer ArrayList hinzufüge, gehen sie in das Array in Indexreihenfolge. Wenn ich später auf diese ArrayList zugreife, erhalte ich das Objekt nach Index. So funktioniert auch NSMutableArrays. Wenn ich also den Kontext speichere, erwarte ich von Core Data, dass meine verwalteten Objekte und alle Sammlungen, auf die in meinen verwalteten Objekten verwiesen wird, in der Reihenfolge gespeichert werden, in der sie der Sammlung hinzugefügt wurden. Aber das ist nicht der Fall. Ich kann auch einfach zum relationalen Modell zurückkehren. –
Martin du hast mein Problem gelöst. Sobald ich NSMutableArray in NSMutableSet änderte, funktionierte alles genau. Danke vielmals. –