核心数据崩溃:在实体中找不到Keypath项目

时间:2013-05-02 05:36:47

标签: iphone core-data nsfetchrequest nsfetchedresultscontroller

- (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!");
    }
}

在viewDidLoad方法中设置了entityDescription和上下文,如下所示:

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

崩溃信息: * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:'在实体中找不到keypath项目'


有人能帮忙吗?;)

4 个答案:

答案 0 :(得分:6)

排序描述符中使用的键

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

必须是核心数据实体的属性,而不是实体本身的名称。 所以你应该用排序描述符替换@"Project"中的@"name" 项目实体,例如{{1}}。

答案 1 :(得分:0)

设置缓存名称,如:

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

答案 2 :(得分: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);
}

答案 3 :(得分:0)

它与最初的问题无关,但与问题的标题高度相关。 由于这是我找到的唯一关于此主题的内容,因此对其他人可能有用:

因此,我遇到了“核心数据崩溃:'在实体中找不到关键路径视频...'”,因为我在谓词中使用了字符串插值:

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

正确的方法是:

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

希望,这将使某人节省几个小时来弄清楚发生了什么事情。