3
votes
- (void)fetchResult
{
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Project" ascending:YES];

    [request setEntity:self.entityDescription];
    [request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];
    self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil];

    NSError *fetchError = nil;
    BOOL success = [self.fetchResultController performFetch:&fetchError];
    if (success) {
        NSLog(@"fetched!");
    }
    else {
    NSLog(@"fetch fail!");
    }
}

The entityDescription and the context is set in the viewDidLoad method, as it is shown below:

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
self.managedObjectContext = appDelegate.managedObjectContext;
self.entityDescription = [NSEntityDescription entityForName:@"Project" inManagedObjectContext:self.managedObjectContext];

Crash info: * Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'keypath Project not found in entity '


Could anybody give a hand?;)

4

4 Answers

12
votes

The key used in the sort descriptor

[NSSortDescriptor sortDescriptorWithKey:@"Project" ascending:YES];

must be a property of your Core Data entity, not the name of the entity itself. So you should replace @"Project" in the sort descriptor by some property of the Project entity, such as @"name".

3
votes

It is not related to the initial question, but it is highly related to the title of the question. And as it was the only one I've found for this topic, it may be useful for someone else:

So, I've got "Core Data crash: 'keypath Videos not found in entity ...'" because I've used string interpolation in a predicate:

let projectName = "Videos"
let predicate = NSPredicate(format: "\(#keyPath(Scene.relatedProject.name)) == \(projectName)")

The correct way is:

let projectName = "Videos"
let predicate = NSPredicate(format: "\(#keyPath(Scene.relatedProject.name)) == %@", projectName)

Hope, it will save someone hour(s) of figuring out what is going on.

0
votes
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];

[fetchRequest setPredicate:predicate];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Project"          inManagedObjectContext:context];

NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"Column_Name"  ascending:YES];

[request setSortDescriptors:[NSArray arrayWithObject:sortDescriptor]];

[fetchRequest setEntity:entity];

NSError *error = nil;
NSArray *arrTemp = [context executeFetchRequest:fetchRequest error:&error];

if([arrTemp count]>0){
   NSLog(@"%@",arrTemp);
}
0
votes

Set cache name like:

self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"temp"];