FetchRequest Template

I had been using core data fetch request for a long time and while browsing about the fetch request, I came across a feature called Fetch Request Template.

This blog describes about the  FetchRequestTemplate in detail.

What is Fetch Request Template :

Fetch request templates allow to pre-define queries and their parameters in the model (with the tool) – typically they contain variables that need to be substituted at runtime.

How It Works :

Let have a model with the entity student and attributed listed below :

FRT-1

Step 1 : Create the Template

Approach 1:

NSManagedObjectModel *model = // reference to model
NSFetchRequest *requestTemplate = [NSFetchRequest new];
NSEntityDescription *entityDescription = [[model entitiesByName] objectForKey:@“Student”];
[requestTemplate setEntity:entityDescription]; 
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat: @”(name like[cd] $NAME) AND  (age > $AGE)”];
[requestTemplate setPredicate:predicateTemplate];
[model setFetchRequestTemplate:requestTemplate forName:@“StudentWithNameWithAge”];

Approach 2:

Go to your model (xcdatamodel) file, then Editor -> Add Fetch Request. The UI makes it easy to write a complex fetch request. Unlike the previous approach, you cannot store things like sort descriptors. You’d have to add those after you retrieve the template.

FRT-2

Step 2 : Access the Template

NSManagedObjectContext *moc = // reference to context
NSManagedObjectModel *model = // reference to model  
NSError *error = nil;
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys: myName, @“NAME”,  age, @“AGE”, nil];
NSFetchRequest *fetchRequest = [model fetchRequestFromTemplateWithName:@“StudentWithNameWithAge”  substitutionVariables:substitutionDictionary];
NSArray *results = [moc executeFetchRequest:fetchRequest error:&error];
// Process results

Points to Consider :

1If the template contains a predicate with substitution variables, you should instead use
fetchRequestFromTemplateWithName:substitutionVariables: to create a new fetch request.

2If you use fetchRequestFromTemplateWithName:substitutionVariables:. The variables dictionary must provide values for all the variables. If you want to test for a nil value, use [NSNull null].  This method provides the usual way to bind an “abstractly” defined fetch request template to a concrete fetch.

3If you use  setFetchRequestTemplate:forName:. This method raises an exception if the receiver has been used by an object graph manager.

Happy Coding….

Arasuvel,
iOS Developer,
Mallow Technologies.

Leave a Reply

%d bloggers like this: