Core Data crash: Keypath Project not found in entity
Asked Answered
N

5

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

Nowt answered 2/5, 2013 at 5:36 Comment(0)
R
13

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

Ramer answered 2/5, 2013 at 8:4 Comment(0)
W
6

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.

Woodprint answered 8/11, 2019 at 16:25 Comment(1)
I believe adding single quotes around the string interpolation would also have been an acceptable solution. let predicate = NSPredicate(format: "\(#keyPath(Scene.relatedProject.name)) == '\(projectName)'")Mandola
C
2

make sure you are using below syntax for your Query Example:

fetchRequest.predicate = NSPredicate(format: "username = %@", userName)

where username is the key and userName is variable to hold any name in the example.

Caston answered 27/8, 2021 at 16:48 Comment(1)
That did it for me - I forgot about that operator. ThanksEurhythmics
W
0

Set cache name like:

self.fetchResultController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"temp"];
Winch answered 2/5, 2013 at 5:48 Comment(0)
F
0
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);
}
Froma answered 2/5, 2013 at 13:13 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.