2012-10-13 83 views
5

我正在使用核心数据,并试图让它显示一个简单的数据模型的数据。该应用程序崩溃,并给了我这个错误消息核心数据给出错误

终止应用程序由于未捕获的异常“NSInvalidArgumentException”,原因是:“+ entityForName:无不是合法的NSManagedObjectContext参数搜索实体名称'提醒”

我不完全确定,但我怎么看它是说它无法找到我的实体叫Remind?但是,我确实有一个名为Remind的实体。

我也把断点,并在这里停止:enter image description here

任何帮助将不胜感激。完全处于死胡同。在应用程序委托

托管上下文代码.M

enter image description here

+0

您的托管对象上下文为零。我认为这是一个伊娃...它没有被设置任何东西。 –

+0

感谢您的回复。你能告诉我如何解决这个问题吗? – Zack

+0

不幸的是,或者我会把它放在答案中。您需要添加更多代码,这里没有足够的信息。在你的视图控制器中你在哪里设置managedObjectContext ivar? –

回答

1

这里的问题是,您的访问和您的伊娃具有相同的名称。这就是underbar ivar convention的来源。在这里,你没有使用访问器来访问你的属性,你直接使用了支持变量,所以它不会被初始化。相反,确保你总是通过你的访问器方法,你不会有问题。因此,改写违规方法(和任何其他人使用managedContextObject属性的东西,如下列:

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; // it's good practice to call the super methods, even if you're fairly certain they do nothing 

    // Get a reference to the managed object context *through* the accessor 
    NSManagedObjectContext* context = [self managedObjectContext]; 

    // From now on, we only use this reference in this method 
    NSFetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription* entity = [NSEntityDescription entityForName:@"Remind" inManagedObjectContext:context]; // <- use the local reference we got through the accessor 
    [request setEntity:entity]; 
    NSError* error = nil; 
    NSArray* array = [context executeFetchRequest:request error:&error]; 
    if(!array) { 
    // Do something with the error 
    NSLog(@"Error Fetching: %@", error); 
    } 
    [self setDesitnationsArray:[array mutableCopy]]; 
    [destinationsTableView reloadData]; 
} 

你可能想改变你的ivars的东西,你会不动心使用,或者将立即显然你还没有浏览访问器,比如_managedObjectContext甚至_privateContext,或者任何会在你习惯通过访问器访问属性之前就会遇到的问题,如果你不喜欢访问属性的Objective-C语法,可以使用点语法,但是您必须始终记住要经过self,例如self.managedObjectContext。我不喜欢这种方法,因为人们忘记它不是一个直接的属性访问,而是使用访问器,所以他们认为可以直接访问的点语法交换,当它不是时(比如你的情况)。

+0

谢谢你的回答。但是,我确实改变了上面的代码,像下面这样,不幸的是它仍然给我提供了同样的错误。 – Zack

+0

@zack,然后从您的应用程序委托中获取它。你的问题是,你的伊娃是零,这是一个错误。您实际上没有对该方法中的托管对象上下文的引用。 –

+0

@JasonCoco我有同样的问题。在我的情况下,上下文无效。你可以让我知道如何从App Delegate获得它吗? –