CoreData und NSSet

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData und NSSet

    Hallo,

    ich bin gerade dabei mit coreData zu arbeiten und stoße gerade auf ein Problem, da ich verschachtelte Relationchips habe. Ich habe Events, welche mehrere Personen und bei den Personen noch Kosten. Somit habe ich To-Manay-Relationchips welche einen NSSet benötigen.

    Hier ist auch mein Problem ich weiß nicht wie ich mit diesem NSSet bei den Relationchips umgehen muss.

    Kann mir einer von euch sagen wie man damit umgehen musst? Was passiert wenn ich die Kosten bei einer Person lösche, muss ich dann per Hand die Entsprechende Werte aus dem NSSet entfernen? Wie füge ich neue Personen oder Kosten in so ein NSSet ein ohne dabei Daten zu verlieren usw..

    Gruß

    Bongartz
    Vielen Dank

    Gruß

    Bongartz
  • So habe etwas weiter gemacht, aber leider bekomme immer einen Abstutzt bei der App wenn ich einen zweiten Datensatz hinzufügen möchte.


    Hier mal mein Code.

    Quellcode

    1. if([segue.identifier isEqualToString:@"neuePerson"] && self.tableView.editing == NO) {
    2. AddPersonViewController *controller = segue.destinationViewController;
    3. controller.person = [JSMCoreDataHelper insertManagedObjectOfClass:[Person class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    4. controller.kosten = [JSMCoreDataHelper insertManagedObjectOfClass:[Kosten class] inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    5. controller.kosten.event = self.event;
    6. NSSet *personEvent;
    7. if (self.event.person == nil) {
    8. personEvent = [NSSet setWithObjects:controller.person, nil];
    9. } else {
    10. NSMutableArray *setArray = [NSMutableArray arrayWithArray:[self.event.person allObjects]];;
    11. [setArray addObject:self.event];
    12. personEvent = [NSSet setWithArray:setArray];
    13. }
    14. self.event.person = personEvent;
    15. return;
    16. }
    Alles anzeigen
    Vielen Dank

    Gruß

    Bongartz
  • 1. Dein "CoreDataHelper" ist offenkundig eine unsinnige Klasse, weil sie keinen Kontext besitzt. Abgesehen davon, dass man derlei Tipphelfer generell nicht braucht, ließen sie sich sprachgerechter über Kategorien implementieren.

    2. Der Wechsel zwischen Set und Array resultiert offenkundig aus unzureichender Kenntnis von Cocoa.

    3. KVC hast du dir auch nicht vollständig angeschaut.

    Das ist alles nicht schlimm und lässt sich leicht beheben. Kein Problem. Aber solange das so ist, lohnt es sich nicht, das konkrete Problem anzugehen.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Also im CoreDataHelper habe ich die komplette Kommunikation mit CoreData aufgebaut. Hier ein kurzer Überblick über meine Methoden in dieser Klasse:

    Quellcode

    1. + (NSManagedObjectContext*) managedObjectContext;
    2. + (id) insertManagedObjectOfClass: (Class) aClass inManagedObjectContext: (NSManagedObjectContext*) managedObjectContext;
    3. + (BOOL) saveManagedObjectContext: (NSManagedObjectContext*) managedObjectContext;
    4. + (NSArray*) fetchEntitiesForClass: (Class) aClass withPredicate: (NSPredicate*) predicate inManagesObjectContext: (NSManagedObjectContext*) managedObjectContext;
    5. + (BOOL) performOnFetchResultController: (NSFetchedResultsController *) fetchResultController;


    Mit dieser Datei kann ich super leicht und einfach arbeiten. Meinen FetchResultController baue ich immer dann auf wenn ich Daten aus CoreData laden will. Ich habe kein Problem Daten zu erzeugen oder zu ändern in CoreData solange diese keinen To-Manay Relationship haben und einen NSSet benötigen.

    Bei Punkt zwei hast du komplett recht, das ich keinen Ahnung habe, deswegen frage ich hier ja wie ich es sinnvoll und sauber lösen kann.
    Vielen Dank

    Gruß

    Bongartz
  • Ah Frankys Core Data Helper.

    Dann mal ein Beispiel on the fly getippt:

    Gegeben sei "KundeET" mit den Attributen
    "firmaKundeAT" und "ortKundeAT".

    Weiter sei eine 1-to-many-Relationship nach
    "AuftragET" mit dem Attribut "rechnungsnummerAuftragAT" gegeben.


    Du hast also einen Kunden, der mehrere Rechnungen haben kann. Du willst nun für einen bestimmten Kunden, eine ganz bestimmte Rechnung mit der Nummer "465" finden.

    Suchen wir den Kunden.

    Quellcode

    1. NSString *sucheOrt = @"Hamburg";
    2. NSString *sucheKunde = @"Müller GmbH";
    3. NSPredicate* suche = [NSPredicate predicateWithFormat:@"firmaKundeAT == %@ AND ortKundeAT == %@", sucheKunde, sucheOrt];
    4. KundeET* gefundenKunde = [[CoreDataHelper fetchEntitiesForClass:[KundeET class] withPredicate:suche inManagesObjectContext:[CoreDataHelper managedObjectContext]]lastObject];



    "gefundenKunde" ist Dein Kunde "Müller GmbH aus Hamburg". Hier solltest Du prüfen, ob da auch wirklich einer ist.
    Beispielsweise mit if (!gefundenKunden { return; // sofern nichts da ist}

    Jetzt wollen wir mal in seinen Aufträgen stöbern und basteln uns wieder ein NSPredicate.

    Quellcode

    1. int sucheAuftrag = 465;
    2. NSPredicate* auftragsSuche = [NSPredicate predicateWithFormat:@"rechnungsnummerAuftragAT == %i", auftragsSuche];
    3. for (AuftragET* gefundenerAuftrag in [gefundenKunde.auftragRT filteredSetUsingPredicate:auftragsSuche]) {
    4. if (gefundenerAuftrag) {
    5. //mach halt was mit gefundenerAuftrag
    6. NSLog(@"Die Auftragsnummer: %d", gefundenerAuftrag.rechnungsnummerAuftragAT);
    7. } else {
    8. NSLog(@"Nichts ist drin");
    9. return;
    10. }
    11. }
    Alles anzeigen



    Ist eigentlich auch mit dem CoreDataHelper nicht so schwer. Nur der Übertrag von Word hierher. :)


    Dann mal ran und viel Erfolg
    Andreas
    "Die Welt wird Dich Gehorsam lehren, denn da besteht die Notwendigkeit ein Stück Brot zu verdienen."

    Mika Walthari
  • Bongartz schrieb:

    Also im CoreDataHelper habe ich die komplette Kommunikation mit CoreData aufgebaut. Hier ein kurzer Überblick über meine Methoden in dieser Klasse:

    Quellcode

    1. + (NSManagedObjectContext*) managedObjectContext;
    2. + (id) insertManagedObjectOfClass: (Class) aClass inManagedObjectContext: (NSManagedObjectContext*) managedObjectContext;
    3. + (BOOL) saveManagedObjectContext: (NSManagedObjectContext*) managedObjectContext;
    4. + (NSArray*) fetchEntitiesForClass: (Class) aClass withPredicate: (NSPredicate*) predicate inManagesObjectContext: (NSManagedObjectContext*) managedObjectContext;
    5. + (BOOL) performOnFetchResultController: (NSFetchedResultsController *) fetchResultController;


    Mit dieser Datei kann ich super leicht und einfach arbeiten. Meinen FetchResultController baue ich immer dann auf wenn ich Daten aus CoreData laden will. Ich habe kein Problem Daten zu erzeugen oder zu ändern in CoreData solange diese keinen To-Manay Relationship haben und einen NSSet benötigen.

    Bei Punkt zwei hast du komplett recht, das ich keinen Ahnung habe, deswegen frage ich hier ja wie ich es sinnvoll und sauber lösen kann.

    Wobei hilft dir der Helper? Dabei, die Tipparbeit zu verringern? Das ist kein Kriterium. Außerdem erwähnte ich schon, dass man derlei Dinge besser mit einer Kategorie macht – zumal das dann noch mehr Tipparbeit nimmt. ;-)

    Wenn du ein Set verändern willst, ein Set als Ausgangspunkt hast, ein Set als Zielpunkt hast, wieso verwendest du überhaupt ein Array? Nimm ein Set. Die gibt es ja nun auch als Mutable.

    Zu Punkt 3: Lies bitte mal eines der folgenden Dokumente:
    - Apples Doku Key-Value Coding Programming Guide
    - Negm-Awad, Objective-C und Cocoa, S. 467 ff.
    - Negm-Awad, Besseres Key-Value-Coding
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?