Zu blöd für korrektes NSPredicate in CoreData to-many-relationship

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

  • Zu blöd für korrektes NSPredicate in CoreData to-many-relationship

    Hi Leute,

    leider bin ich zu doof, ein entsprechendes Predicate zu verfassen. Folgende Situation:

    Entity Member
    - property name

    Entity Group
    -> to-many-relationship members

    Jetzt möchte ich alle Groups, die Members mit Namen "Müller", "Meier" und "Schmidt" haben. Folgender Code gibt (logischerweise) auch Gruppen zurück, die z.B. nur ein Mitglied namens Müller haben, nicht jedoch Schmidt:

    Quellcode

    1. NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Group" ];
    2. NSSet *name = [ NSSet setWithObjects:@"Müller", @"Meier", @"Schmidt", nil];
    3. [ request setPredicate:[ NSPredicate predicateWithFormat:@"ANY members.name IN %@", names ] ];
    4. NSError *error;
    5. NSArray *result = [ managedObjectContext executeFetchRequest:request error:&error ];

    Benutze ich ALL statt ANY erhalte ich keine einzige Gruppe zurück. Muss ich das mit dem IN-Predicate machen und dann von Hand rausfischen oder gibt es eine Möglichkeit, es direkt im predicate zu lösen?

    Danke für Eure Zeit, beste Grüße, Markus
  • macmoonshine schrieb:

    Die Standard-Prädikate reichen da meines Erachtens nicht für aus. In SQL habe ich solche Probleme durch zählen gelöst; also die Anzahl der Elemente in der Gruppe muss genau der Anzahl der Elemente in der Menge entsprechen. In Core Data lässt sich das vielleicht über einen Block lösen.

    Da wäre es wohl einfacher, das Prädikat zu negieren und auf 0 zu testen.
    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"?
  • Danke Euch schonmal für Eure Antworten!

    @macmoonshine
    Leider kann man predicateWithBlock nicht mit dem NSSQLStoreType benutzen, sorry, hatte vergessen zu sagen, dass ich den benutze.

    @Amin
    Ja, das mit dem Subprädikat ist ein guter Hinweis, irgendwie muss ich die inverse-relationship von Member nach Group auf Gleichheit prüfen. Mal sehen, ob ich an der Stelle weiter komme.

    Besten Dank nochmal, Gruß, Markus
  • So, dank Eurer Denkanstöße hab ich die Lösung:

    Quellcode

    1. NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Group" ];
    2. NSSet *name = [ NSSet setWithObjects:@"Müller", @"Meier", @"Schmidt", nil];
    3. [ request setPredicate:[ NSPredicate predicateWithFormat:@"SUBQUERY(members, $member, $member.name IN %@).@count == %d", names, [ names count ] ];
    4. NSError *error;
    5. NSArray *result = [ managedObjectContext executeFetchRequest:request error:&error ];

    Es war also sowohl das Zählen, als auch das Subprädikat, DANKE!

    Das hier hab ich noch gefunden:
    funwithobjc.tumblr.com/post/27…what-the-heck-is-subquery

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Markus Müller ()