Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Core Data crash: Keypath Project not found in entity

- (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?;)

like image 452
JackieLam Avatar asked Dec 03 '22 23:12

JackieLam


2 Answers

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".

like image 98
Martin R Avatar answered Jan 04 '23 19:01

Martin R


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.

like image 29
ViktoR Avatar answered Jan 04 '23 19:01

ViktoR