【问题标题】:Multiple Unrelated Entities in one Core Data Model一个核心数据模型中的多个不相关实体
【发布时间】:2010-02-11 22:06:28
【问题描述】:

我想在我的数据库中有两个完全不相关的表,为此我在我的核心数据模型中定义了两个不同的实体。

除此之外,我有一个不同的 ViewController 使用这些实体中的每一个,因此我正在以这种方式初始化两个不同的 fetchedResultsController(每个 ViewController 中一个):

// Create the fetch request for the entity.
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
// Edit the entity name as appropriate.
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" 
    inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

需要注意的是,MOM 只在基于 XCode 模板的 AppDelegate 中初始化一次。

当我在模型中只有一个 ViewController 和一个实体时,一切正常,但是即使我在模型中定义了第二个实体,我也无法让第二个 ViewController 初始化 fetchedResultsController(再次基于 XCode 模板)。我总是收到以下错误:

2010-02-11 22:02:55.078 JournalTool[3094:207] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'EventTag''

我可能遗漏了一些基本的东西并且做了一些非常愚蠢的事情,但我们将不胜感激。

谢谢,
保罗

【问题讨论】:

  • 您是否对两个提取使用相同的托管对象上下文? (你应该)
  • 是的,托管对象模型和托管对象上下文都在 AppDelegate 中初始化一次,我只是将相同的上下文传递给两个 ViewController,例如[tagsViewController setManagedObjectContext:self.managedObjectContext];
  • 这可能听起来很傻,但是自从将第二个实体添加到模型中后,您是否重置了模拟器(假设您没有在设备上运行)或从中删除应用程序?也许它仍然有旧模型。
  • 是的,我从设备和模拟器中删除了应用程序,重新启动模拟器并执行了几次完全干净的项目构建。我认为我只是在让两个 fetchedResultsControllers 引用一个 MOM 时做错了,但这里的 cmets 似乎没有暗示这一点。
  • 见这里:developer.apple.com/mac/library/documentation/cocoa/Conceptual/… 它说的一件事是确保托管对象上下文不为零(内存地址为 0x0,如果您单步执行并将鼠标悬停在对象上)。你是如何设置 managedObjectContext 的?

标签: iphone objective-c core-data


【解决方案1】:

您传递给第二个视图控制器的managedObjectContext 可能实际上是nil。打电话之前

[tagsViewController setManagedObjectContext:self.managedObjectContext];

验证self.managedObjectContext 不是nil:

if(!self.managedObjectContext){
  NSLog(@"invalid managedObjectContext");
  // now get a valid managedObjectContext
  // and pass it to your view controller  
}

【讨论】:

  • MOC 本身并不是空的,但这让我想到了我的 ViewControllers 上的排序。我实际上是在尝试将 MOC 传递给子 ViewController,因此它是第二个视图控制器本身,此时它是 nil。因此我改变了一些事情,以便我的子视图在 viewDidLoad 方法中从它的 parentView 检索 MOC,即 self.managedObjectContext = parentViewController.managedObjectContext;感谢您帮助解决此问题,非常感谢。
  • 为了避免此类问题,我总是直接从应用程序委托中检索 managedObjectContext,它在我实例化的任何视图控制器中始终可用。
  • 这是个好主意,听起来更安全。将来我会确保我的所有 ViewController 都引用了 AppDelegate,然后我会直接在 viewDidLoad 方法中检索它。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多