【问题标题】:Core Data Giving Error核心数据提供错误
【发布时间】:2012-10-03 21:17:21
【问题描述】:

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

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

我不完全确定,但我如何理解它是说它找不到我的名为 Remind 的实体?但是,我确实有一个名为 Remind 的实体。

我也设置了断点,它就停在这里:

任何帮助将不胜感激。完全处于死胡同。

App Delegate .m 中的托管上下文代码

【问题讨论】:

  • 您的托管对象上下文为零。我假设它是一个 ivar……它没有被设置为任何东西。
  • 感谢您的回复。你能告诉我如何解决这个问题吗?
  • 不幸的是,没有,否则我会把它放在答案中。您需要添加更多代码,这里没有足够的信息。您在视图控制器的哪个位置设置 managedObjectContext ivar?
  • 老实说,我正在使用源代码。源代码工作得很好。它似乎不想和我一起工作。我正在 App Delegate 中进行设置。我将编辑帖子以向您展示我正在设置它的应用程序委托 .m 文件。不过它一定很简单。

标签: ios xcode core-data


【解决方案1】:

这里的问题是您的访问器和您的 ivar 具有相同的名称。这就是下划线 ivar 约定的来源。在这里,您没有使用访问器来访问您的属性,而是直接使用支持变量,因此它永远不会被初始化。相反,请确保您始终通过您的访问器方法,并且您不会遇到问题。因此,重写有问题的方法(以及任何其他使用 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。我不喜欢这种方法,因为人们忘记了它不是直接的属性访问并且它正在使用访问器,所以他们认为可以将点语法交换为直接访问,而不是(就像你的情况一样)。

【讨论】:

  • 感谢您的回答。但是,我确实像您一样将上面的代码更改为以下代码,但不幸的是它仍然给了我同样的错误。
  • @zack,然后从你的应用代理那里得到它。您的问题是您的 ivar 为零,这是一个错误。您实际上并没有在该方法中引用托管对象上下文。
  • @JasonCoco 我也有同样的问题。在我的情况下,上下文为零。请告诉我如何从 App Delegate 获取它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
  • 2010-10-30
  • 2011-10-30
  • 2014-07-05
  • 2012-03-28
相关资源
最近更新 更多