CoreData nur Werte anzeige die Keine Relationship haben

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

  • CoreData nur Werte anzeige die Keine Relationship haben

    Servus,

    ich stehe gerade vor einem Verständnisproblem bei CoreData. Ich brauche eine NSPredicate Abfrage bei der nur die Datensätze benötige die nicht zutreffen. Eigentlich ist es ja kein großes Problem dies kann man ja wie folgt lösen:

    Quellcode

    1. self.basePredicate = [NSPredicate predicateWithFormat:@"ANY %K != %@", cEntityKostenRelationshipEvent, self.event];


    Nur ich habe das Problem das ich hier in einem To-Many Relationship habe, was ja eigentlich auch nicht das Problem ist.

    Jetzt zu meinem Problem, ich habe eine Anzahl von x Personen, welche jeweils eine Anzahl y an Events haben kann. Jede Person hat zu einem Event noch z Kosten. Ich will eine Liste anzeigen mit Personen die noch nicht in diesem Event vorkommen.
    Also bei denen noch kein Relationship zu einem Event vorhanden ist. Nur leider habe ich das Problem, dass eine Person ja y Events haben kann, somit erkennt CoreData das die Person schon in diesem Event ist, aber zeigt mir diese trotzdem an, da das nächste Event von dieser Person ein anderes Event ist. Kann ich die CoreData Abfrage bei diesem Fall "überspringen" lassen, das diese dann die Person nicht weiter durchsucht und diese nicht weiter beachtet?

    Danke

    Gruß

    Bongartz
    Vielen Dank

    Gruß

    Bongartz
  • Ich glaube Dein Prädikat passt nicht auf Deine Fragestellung (und die ist nicht klar, weshalb Du hier auch noch keine befriedigende Antwort hast). Wenn ich Dich richtig verstanden habe, hast Du eine Person ausgewählt, zu dieser eins ihrer Events und jetzt möchtest Du alle Personen, die nicht in diesem Event sind? Oder einfach nur alle Personen, die noch überhaupt keinem Event zugewiesen sind?
  • Ja das mein Prädikat nicht stimmt weiß ich leider.

    Ok ich versuche noch mal meine Frage etwas besser zu beschreiben.

    Mein Ziel ist eine Liste von Personen die noch nicht in diesem Event sind.

    Ich habe Person 1 und Person 2

    Event 1, Event 2 und Event 3

    Wenn ich Person 1 nur in Event 1 habe, in Event 2 noch keine Personen und mir dann liste für Event 2 Anzeige lasse, werden mir in dieser Liste beide Personen angeizeigt. Bei der Liste für Event 1 wird nur Person 2 angezeigt. Also alles gut.

    Wenn ich jetzt aber Person 1 auch Event 2 zuweise und mir danach noch mal die Liste für Event 1 oder 2 anzeigen lasse, dann wird mir jedes mal Perwon 1 angezeigt.

    Weil mein Prädikat immer nur ein Relationship gleichzeitig anschaut und einmal sieht das die Person 1 im Event 1 vorhanden ist und diese Person somit raus Filter, da aber dann der zweite Relationship mit dem Event 2 für Person 1 gefunden wird, wird die Person zu den Ergebnissen hinzugefügt.

    Ich will jetzt wissen ob man so etwas mit CoreData leicht umgehen kann oder ob man selber diese Filterung auf Array Basis durchführen muss.
    Vielen Dank

    Gruß

    Bongartz
  • Sehe gerade, dass event ja eine to-many-relationship ist (solltest Du in events umbenennen, ebenso wie Events.person in Events.persons). Brauchst Du denn überhaupt ein Prädikat?

    Quellcode

    1. NSSet *allPersons = ...
    2. NSMutableSet *personsNotInEvent = [ self.event.persons mutableCopy ];
    3. [ personsNotInEvent minusSet:allPersons ];
  • Danke für die Antwort und Entschuldigung das ich so lange gebraucht habe.

    Finde deinen Ansatz wirklich sehr interessant, nur irgendwie bekomme ich von meiner Abfrage von coreData nicht alle Personen auch wenn ich das Predicate auf nil setze. Übersehe ich irgendwas?


    Quellcode

    1. -(NSFetchedResultsController *)fetchedResultsController {
    2. if(self.personenForEventFetchResultsController != nil) {
    3. return self.personenForEventFetchResultsController;
    4. }
    5. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc]init];
    6. NSEntityDescription *entityDescription = [NSEntityDescription entityForName:cEntityPerson inManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    7. fetchRequest.entity = entityDescription;
    8. fetchRequest.predicate = self.fetchPredicate;
    9. fetchRequest.fetchBatchSize = 64;
    10. NSSortDescriptor *sortPerson = [[ NSSortDescriptor alloc] initWithKey:cEntityPersonAttributeVorname ascending:YES];
    11. NSArray *sortArray = [NSArray arrayWithObject:sortPerson];
    12. fetchRequest.sortDescriptors = sortArray;
    13. self.personenForEventFetchResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[JSMCoreDataHelper managedObjectContext] sectionNameKeyPath:nil cacheName:nil];
    14. self.personenForEventFetchResultsController.delegate = self;
    15. return self.personenForEventFetchResultsController;
    16. }
    Alles anzeigen


    Sonst habe ich noch das Problem das meine App hier immer abschmiert.

    Quellcode

    1. self.fetchPredicate = nil;
    2. [JSMCoreDataHelper performOnFetchResultController:self.fetchedResultsController];
    3. NSMutableSet *allPersons = [NSSet setWithArray:[self.fetchedResultsController fetchedObjects]];
    4. NSSet *personsNotInEvent = [self.event.person mutableCopy];
    5. [allPersons minusSet:personsNotInEvent];
    6. self.arrayWithPeople = [allPersons allObjects];
    Alles anzeigen


    Hier der Fehler.

    Quellcode

    1. -[__NSSetI minusSet:]: unrecognized selector sent to instance 0xec8bb70


    Danke
    Vielen Dank

    Gruß

    Bongartz
  • Die Fehlermeldung sagt doch alles. Wenn Du ein NSMutableSet brauchst, dann musst Du auch ein solches erstellen.

    NSMutableSet *allPersons = [NSMutableSet setWithArray:[self.fetchedResultsController fetchedObjects]];

    Der Compiler sollte Dir die Codezeile allerdings bereits angekreidet haben. Warnungen werden nicht zum Spass ausgesprochen. Nimm sie ernst.

    Michael