无法找到实体名称的NSManagedObjectModel - Universal App

时间:2011-06-15 00:32:16

标签: iphone core-data nsmanagedobject

我的应用中出现了一个奇怪的错误:

* 由于未捕获的异常'NSInternalInconsistencyException'而终止应用程序,原因:'+ entityForName:无法找到实体名称'Book'的NSManagedObjectModel

我知道,在这里和网上有“无法找到实体名称的NSManagedObjectModel”的内容,但奇怪的是,它是一个通用的应用程序,而且iphone应用程序始终正常,只有ipad应用程序是在启动时崩溃。

在主AppDelegate中,有一些代码在两个方法中,在iphone / ipad AppDelegate中,我在applicationdidFinishLaunchingWithOptions中调用此代码,如下所示:

    if ([self modelExists] == NO) {
    [self buildModel];
}

所以它与我调用代码的方式相同,但是ipad版本崩溃而iphone版本没有崩溃。

唯一的不同是iPhone版本使用TabBarContoller(在IB中设置),iPad版本使用单个viewController(也在IB中设置)。

它发生在模拟器和设备上。

我不知道该怎么做。希望你能明白我的意思...... 多谢 塞巴斯蒂安

编辑: 我发现,当我运行iPhone版本时,主AppDelegate中的代码应该被调用,但是当我运行主要appDelegate的iPad版本NONE代码时,根本没有调用,所以没有创建托管对象,那就是错误的原因。但为什么主AppDelegate中没有代码运行? THX

EDIT2: 这是我现在的主AppDelegate中的代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
if ([self modelExists] == NO) { // Checks if the model is allready filled up or not. (Uses  CoreData stuff of course)
// iPhone Version is fine here. iPad Version crashes.
    [self buildModel];
}    

[self buildInterface]; // Called in the iPhone or iPad AppDelegate to make the window visible etc.
return YES;
}

所以在iphone和ipad版本中调用了didFinishLaunchingWithOptions。 iPad版本无论如何都没有运行coredata的东西,而iphone版本确实运行了coredata的东西。知道什么可能是错的吗? THX!

4 个答案:

答案 0 :(得分:1)

如果app委托没有被设置为应用程序的委托,那么它可能没有运行任何代码。

在主NIB中查找iPad版本,并确保将“AppName App Delegate”设置为该NIB的文件所有者的代表。

答案 1 :(得分:1)

我发现了我的问题。真奇怪......

这是“modelExists”的代码

- (BOOL)modelExists {
NSFetchRequest *request = [[NSFetchRequest alloc] init];
request.entity = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:__managedObjectContext]; //<- Crashed. Had to change it to self.managedObjectContext
request.predicate = nil;
NSError *error = nil;
...

塞巴斯蒂安

答案 2 :(得分:0)

我有同样的问题。我的应用程序在开发过程中已经运行了好几个星期,然后它突然崩溃了这个错误。将managedObjContect更改为[self managedObjectContext]解决了这个问题。

我很想知道为什么......那里有专家吗?为什么原始代码能够将对managedObjectContext的调用解析为成员函数的实现....并且突然无法实现?据我所知,此代码没有其他静态实现可见。

感谢发布此内容,为我节省了数小时的麻烦。

答案 3 :(得分:0)

在我的项目中,我有一个导航控制器,当我试图进入子视图控件时,我收到了这个错误。

问题是我需要传递set managedObjectContext。这取自CoreDate Master / Detail示例。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"showDetail"]) {
        NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
        NSManagedObject *object = [[self fetchedResultsController] objectAtIndexPath:indexPath];
        [[segue destinationViewController] setDetailItem:object];
        // set the managedObjectContext, too, if you need it
        [[segue destinationViewController] setManagedObjectContext:self.managedObjectContext];
    }
}

另外,仔细检查Interface Builder中的segue标识符是否匹配此函数中的内容(本例中为showDetail)。