2013-03-14 94 views
3

好吧,ios 6核心数据“CoreData:错误:严重的应用程序错误。”

这是我有史以来第一篇文章。几小时后,我一直在头撞墙。我讨厌输入问题;你可以相信我已经彻底试图找出自己的想法。我对以下错误做了一些研究,但是我仍然无法解决它。这就是说,我是noob iOS 6开发人员,并且在核心数据方面存在问题。错误是:

“CoreData:错误:严重的应用程序错误,在核心数据更改处理过程中发生异常,这通常是NSManagedObjectContextObjectsDidChangeNotification观察者中的一个错误,ALL或ANY操作符的左侧必须是NSArray或NSSet与用户信息(空)“

现在,我的数据模型如下:我有两个实体(一对多关系)。这种关系是行为 - >事件,其中有0个事件发生的未绑定事件。

我做的是这个;

在行为表视图控制器,我填充一个NSFetchedResultsController类似如下:

- (NSFetchedResultsController *)fetchedResultsController { 

    NSLog(@"Started Fetching In Behaviors..."); 

    if (fetchedResultsController != nil) { 
    return fetchedResultsController; 
    } 

    AppDelegate *appDelegate = 
    [[UIApplication sharedApplication] delegate]; 

    NSManagedObjectContext *context = 
    [appDelegate managedObjectContext]; 

    NSEntityDescription *entityDesc = 
    [NSEntityDescription entityForName:@"Behavior" 
     inManagedObjectContext:context]; 
    [fetchRequest setEntity:entityDesc]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 

    self.fetchedResultsController = aFetchedResultsController; 
    return fetchedResultsController; 

} 

所有这一切工作正常,虎背熊腰,脚蹬dory的。表填充没有问题。现在,当选择一个单元格我做什么,我实例化另一个UITableViewCell的控制器,

{ 
    NSLog(@"A value was selected from the table view"); 
    IncidentsViewController *vc = [[IncidentsViewController alloc] initWithStyle:UITableViewStylePlain]; 
    vc.managedObject = [self.fetchedResultsController objectAtIndexPath:indexPath]; 
    vc.parentRelationship = [self.fetchedResultsController objectAtIndexPath:indexPath];  
    NSLog(@"Managed set on Incidents View Controller: %@", vc.managedObject); 
    NSString* name = [[NSString alloc] initWithString:[[vc.managedObject valueForKey:@"name"] description]]; 
    NSLog(@"Name of selected object: %@", name); 
    [self.navigationController pushViewController:vc animated:YES]; 
} 

从上面下IncidentsViewController具有基本上完全相同的fetchedResultsController。我将粘贴它的完整性。

- (NSFetchedResultsController *)fetchedResultsController2 { 

    NSLog(@"Started Fetching Resuts from Incidents View Controller..."); 

    if (fetchedResultsController2 != nil) { 
     NSLog(@"fetchedResultsController not null"); 
     return fetchedResultsController2; 
    } 

    AppDelegate *appDelegate = 
    [[UIApplication sharedApplication] delegate]; 

    NSManagedObjectContext *context = 
    [appDelegate managedObjectContext]; 

    NSEntityDescription *entityDesc = 
    [NSEntityDescription entityForName:@"Incident" 
       inManagedObjectContext:context]; 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    [fetchRequest setEntity:entityDesc]; 


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"when" ascending:NO]; 
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSLog(@"parent relationship: %@", self.parentRelationship); 
    NSLog(@"managed object: %@", self.managedObject); 

    [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY relationship == %@", self.parentRelationship]]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController2 = aFetchedResultsController; 

    /* 
    self.fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    self.fetchedResultsController.delegate = self; 
    */ 

    NSLog(@"Ending fetching results from incidents controller..."); 
    return fetchedResultsController2; 
} 

我的问题很简单如下:当我有行

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"ANY relationship == %@", self.parentRelationship]]; 

在第二个视图控制器,一切都被在表中填写正确的(即仅用于为特定的行为事件选择出现在列表中,如果这条线存在,并且我尝试向Incidents实体添加一条新记录,则抛出上面的错误,如果我删除了这条特定行,每一行都出现在列表中但是,当我尝试向事件表添加某些内容时,该错误实际上是在BehaivorViewController中引发的;这是非常令人惊讶,因为我实例化了新的NSFetchedResultsController,AppDelegate和NSManagedObjectContext,它们对于每个相应的视图控制器都是特定的本地的。在我看来,这两个是相互关联的,虽然我似乎无法弄清楚。是否有可能对知道一些关于核心数据的人有所了解。我已为我的完整的项目到以下网址:

https://webshare.uchicago.edu/users/dansully/Public/Dirty.zip

有问题的线是线310 IncidentsViewController.m。

非常感谢您帮助我回答我的问题。我将继续努力,如果我找到解决方案,我会报告回来。

回答

4

如果事件只能有零个或一个父关系,您可能需要尝试从谓词中删除ANY。这是代码:

[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"relationship == %@", self.parentRelationship]]; 
+0

+1 yep。这是实际的问题。 – 2013-03-14 08:42:07

+1

给那个人一支雪茄。 – dps 2013-03-14 15:52:56

相关问题