Let say I have an entity user which has a one to many relationship with the entity menu which has a one to many relationship with the entity meal which has a many to one relationship with the entity recipe which has a one to many relationship with the entity element.
What I would like to do is to select the elements which belong to a particular user (username = myUsername) and particular menus (minDate < menu.date < maxDate).
Does anyone have an idea how to get them?
Thanks
You want to do a fetch on the element entity. From your description, it’s not clear if you’ve defined the inverse relationships1 (e.g. element to recipie) and whether they are to-many or to-one. Assuming you have them defined and they are to-one, you can do your fetch with a predicate like [2]:
I’ve used
LIKE[cd]for a case-insensitive and diacritic-insensitive comparison on usename. Also note that Core Data stores dates as a doubleNSTimeInterval, without time-zone information. If you want to do timezone-sensitive date comparison, you’re in for much more work.1 If you haven’t defined the inverse relationships, do it. As has been said many times elsewhere, Core Data is a graph management framework that just happens to be able to persist its graph to disk. It will do a lot of behind the scenes work to maintain referential integrity for you, automatically, if you define the inverse relationships. Particularly for many-to-many relationships, Core Data virtually requires the inverse to make things work.
[2] If you have defined to-many inverses where I’ve assumed to-one, you’ll have to use a slightly more complicated predicate. The first clause, for example, would be
(this last bit is untested; the KVO set operators are always a bit of experimenting for me). You can read up on the set and array KVO operators.