Search code examples
iosswiftcore-datanscompoundpredicate

NSPredicate: search for an array of values in relation, NOT


I'm a bit lost, and I hope you can help me.

I have two arrays

let stars = ["Paul", "Ringo"]
let visitors = ["bob", "mary"]

Then I have Core Data entities Rockstar and Person. And a one-to-many relation fans between the two.

Now I want to find a couple of specific Rockstars, and make sure that they don't have visitors as fans.

I try to do that with a compound predicate, roughly like this:

let starsPredicate = NSPredicate(format: "id IN %@", stars)
let fansPredicate = NSPredicate(format: "NOT (fans.personid CONTAINS %@)", visitors)

and finally

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [starsPredicate, fansPredicate])

I'm afraid this results in two questions:

  1. What is the correct syntax for the fansPredicate? It works fine with one value, but it crashes on an array

  2. Is this possible with a compound predicate at all? I think if the Person entity is empty, I get zero records from the compoundPredicate.


Solution

  • This can be achieved with a “SUBQUERY”:

    let fansPredicate = NSPredicate(format: "SUBQUERY(fans, $f, $f.personid IN %@).@count = 0",
                                    visitors)
    

    The predicate is true for all Rockstar objects which have no related Person object whose personId is in the given list.