I have a core data model object called Entry. In this I have an attribute IsFavorite.
I would like to use an NSPredicate to filter the results of my NSFetchedResultsController.
Currently I am getting EXC_BAD_ACCESS when the fetch executes.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *thisEntry = [NSEntityDescription entityForName:@"Entry" inManagedObjectContext:managedObjectContext_];
[fetchRequest setEntity:thisEntry];
NSPredicate *fetchPredicate = [NSPredicate predicateWithFormat:@"Entry.isFavorite == %@", [NSNumber numberWithBool: YES]];
[fetchRequest setPredicate:predicate];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error]) {
NSlog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
IF I remove the line that sets the predicate on the fetchRequest, my code executes perfectly.
I am clearly n00bin out on the predicate but have had much trouble trying to find out how to perform operations on a BOOLEAN value from a core data model object. It is noted that there are answers on how to do this with a string or int value but I can't find a BOOLEAN example.
Many thanks !
This isn't really specific to NSPredicate... Whenever you have %@
in a format string, the corresponding value must be a pointer to an object, and BOOL doesn't qualify. So instead of passing YES, pass [NSNumber numberWithBool: YES]
.
In newer versions of Xcode and the SDKs than when I originally wrote the answer, you can use @YES
instead of [NSNumber numberWithBool: YES]
.
From Apple's documentation:
Boolean Values
You specify and test for equality of Boolean values as illustrated in the following examples:
NSPredicate *newPredicate =
[NSPredicate predicateWithFormat:@"anAttribute == %@", [NSNumber numberWithBool:aBool]];
NSPredicate *testForTrue =
[NSPredicate predicateWithFormat:@"anAttribute == YES"];
However, something that caught me out:
Be sure to untick the Optional
entity attribute and set a Default Value
of YES
or NO
, otherwise the column will be empty (null?) and the above predicates will not match rows which are not explicitly set.
I used the great app sqllitebrowser to diagnose this one, by looking at the resulting simulator database.
If you know you're looking for a YES (and therefore don't need to switch between YES or NO in different situations), this worked for me:
[NSPredicate predicateWithFormat:@"isFavorite == 1"]
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With