CoreData predicate for one to many relationship - ios

I have two entity: A and B.
Every element of A can have more elements of B (one to many).
Now I have an item of A and I would to take, in this item, one item B (contained in A) that it has B.field = "myParameter".
How can I generate the Predicate for this?

You may be looking for that (tested with MagicalRecord):
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"(field LIKE %#) AND (isLinkedToAObject == %#)", myFieldParameter, objectA];
With:
ClassB has a property isLinkedToAObject to link it to ClassA.

Related

NSPredicate to query many-to-many relationships

I have two Core Data classes that are related to each other with many-to-many relation. Let the classes be Item and Group, where Item.groups can reference to multiple Group, and Group.items to multiple Item objects.
I am trying to use NSPredicate to query all Item objects that do not belong to a specific Group. Using [NSPredicate predicateWithFormat:#"ANY group == %#", specificGroup] to query Item objects I can get the inverse set of what I want. It has proven hard to accomplish the opposite.
What I have tried and found not working:
[NSPredicate predicateWithFormat:#"NONE groups == %#", specificGroup] // always returns 0 results
[NSPredicate predicateWithFormat:#"NOT (ANY groups == %#)", specificGroup] // always returns 0 results
[NSPredicate predicateWithFormat:#"ANY groups != %#", specificGroup] // always returns 0 results
Any help much appreciated.

CoreData - Fetch request with relationship object

please confirm if i understand that right...
Imagine there is an entity 'person' and an entity 'credit_card'.
So one 'person' can have many 'credit_card's.
The person entity has the attributes: name: STRING and age: INT
and relationship: creditcards (to many) inverse
and the credit card entity has: card_number: INT and valid_date: DATE and relationship: card_user (to one) inverse
In my code i have a specific person (ManagedObject) called f.e. Person *currentUser. If i now want to get all credit cards of this specific person with a specific 'valid_date' i would create a fetch request (for Entity 'credit_card') with following predicates:
NSPredicate *predicate1 = [NSPredicate predicateWithFormat:
#"valid_date == <NSDate object>"];
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:
#"ANY card_user like currentUser"];
This predicate works well for me, but is that the right way? Should i really ask for: "ANY relationship name like ManagedObject" ?
If I'm understanding what you want correctly, all you need to do is use the creditcards property on your Person *currentUser and filter it down:
NSSet *setOfCreditCards = currentUser.creditcards;
NSPredicate *filter = [NSPredicate predicateWithFormat: #"valid_date == %#", date];
NSSet *cardsWithValidDates = [setOfCreditCards filteredSetUsingPredicate:filter];
The reason you tell CoreData about relationships is to avoid making another query from scratch.
You do not need to use the ANY key word if you have set up you core data model correctly. Specifically Credit cards need to have a person relationship back to the person object (you should get a warning if you didn't do this). Then you could combine both predicates into one like this
NSPredicate* predicate = [NSPredicate predicateWithFormat:#"person == %# AND valid_date == %#", currentUser, valid_date];

NSPredicate to return only entities with connected with other entities in one to many relationships

Simple question:
I have an entity group that has to_many relationship with contact entity.
I wish to find only the group entities that their contacts set has at least one contact.
Tried:
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"ANY %K != NULL", GroupRelationships.contact];
But no luck.
Thanks
What you want to do it use the count of the relationship:
[NSPredicate predicateWithFormat:#"contacts.#count > 0"];

NSPredicate for a Core Data Search

I have 3 NSManagedObjets; Person, Stuff, and Collection.
I want to use a NSPredicate to get a list of all Collections that ThePerson has.
Example: Scott has objectA and objectB which are in collection Letters and object1 which is in collection Numbers.
I want to be able to do a fetch request and get back collection Letters and Numbers.
I tried:
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"ANY stuffs.persons == %#", person];
And:
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"SUBQUERY(stuffs, $s, ANY $s.persons == %#)", scott];
Any suggestions?
Your SUBQUERY syntax is wrong (for a full explanation, see this answer or this answer). It should be something like:
SUBQUERY(stuffs, $s, ANY $s.persons == %#).#count > 0
Since it seems that you already have a reference to a ThePerson object, you don't need to do a fetch or use a predicate. You can traverse the relationships you've declared to get the collections. You can get all of the Collections that ThePerson has by using:
NSSet *collections = [person valueForKeyPath:#"stuffs.collections"];

How to use multiple ANY operators within one predicate?

There are two entities C and P with a many-to-many relationship. I am trying to fetch the C entity, where C contains at least one P which consequently contains at least one C with a specific value for its attribute a.
I am trying something like this:
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"ANY p.c.a = %d ", someValue];
However this obviously does not work since P has also a to-many relationship to C. I would need something like this:
NSPredicate *predicate = [NSPredicate predicateWithFormat:#"ANY p.ANY(c).a = %d ", someValue];
How would you write such predicate in the correct way?
If you want to get all C entities that have a relation to at least one P entity, then you can do that with
NSFetchRequest* request = [[NSFetchRequest alloc] initWithEntityName:#"C"];
NSPredicate * predicate = [NSPredicate predicateWithFormat:#"count(p) != 0"];
request.predicate = predicate;
assuming that p is the one-to-many relationship from C to P.

Resources