views:

86

answers:

1

I have an application that uses CoreData and I'm trying to figure out the best way to implement tagging and filtering by tag. For my purposes, if I was doing this in raw SQLite I would only need three tables, tags, item_tags and of course my items table. Then filtering would be as simple as joining between the three tables where only items are related to the given tags. Quite straightforward.

But, is there a way to do this in CoreData and utilizing NSFetchedResultsController? It doesn't seem that NSPredicate give you the ability to filter through joins. NSPredicate's aren't full SQL anyway so I'm probably barking up the wrong tree there. I'm trying to avoid reimplementing my app using SQLite without CoreData since I'm enjoying the performance CoreData gives me in other areas. Yes, I did consider (and built a test implementation) diving into the raw SQLite that CoreData generates, but that's not future proof and I want to avoid that, too.

Has anyone else tried to tackle tagging/filtering with CoreData in a UITableView with NSFetchedResultsController

+2  A: 

First of all, you actually don't need an Item_Tags entity. Core Data is able to model many-to-many relationships without the need for an intermediate entity. You can have a to-many tags relationship that has a reciprocal to-many items relationship and Core Data will do all the magic to make that happen behind the scenes.

So, to set up a fetch request to do what you describe, you'd do something like this. Suppose you have a tag that represents the tag you want to filter on. Write a predicate like this:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"%@ IN tags", tag]];

This will give you a predicate that returns only Items that have tag in their set of tags relationships. Pretty easy, huh?

Remember: Core Data is not a database. It's an object graph management system. The fact that it uses SQL behind the scenes really shouldn't influence the way you use it.

Alex
Wow, so that's all it takes, and it's performant with the fetched results controller? Sounds good to me. I'll look into implementing this.Yeah, I know that Core Data isn't a database. I've been leveraging it's purpose as a persisted object graph quite well. But when it came to this problem, it's my lack of knowledge about how things like these NSPredicates work that made me pine for what I know about SQL. :)
Jonathan Penn