Iphone 找不到实体名称的NSManagedObjectModel-通用应用

Iphone 找不到实体名称的NSManagedObjectModel-通用应用,iphone,core-data,nsmanagedobject,Iphone,Core Data,Nsmanagedobject,我的应用程序中有一个奇怪的错误,它说: *由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“+entityForName:找不到实体名称“Book”的NSManagedObjectModel” 我知道,无论是在这里还是在网络上,都有数百个“找不到实体名称的NSManagedObjectModel”主题,但奇怪的是,这是一个通用应用程序,iphone应用程序总是运行良好,只有ipad应用程序在启动时崩溃 在主AppDelegate中,有两种

我的应用程序中有一个奇怪的错误,它说:

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

我知道,无论是在这里还是在网络上,都有数百个“找不到实体名称的NSManagedObjectModel”主题,但奇怪的是,这是一个通用应用程序,iphone应用程序总是运行良好,只有ipad应用程序在启动时崩溃

在主AppDelegate中,有两种方法的一些代码,在iphone/ipad AppDelegate中,我在ApplicationIDFinishLaunching中调用这些代码,选项如下:

    if ([self modelExists] == NO) {
    [self buildModel];
}
因此,这与我调用代码的方式相同,但ipad版本崩溃,iphone版本没有

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

它发生在模拟器和设备上

我不知道该怎么办。希望你能理解我的意思。。。 Thx很多 塞巴斯蒂安

编辑: 我发现,当我运行iPhone版本时,主AppDelegate中的代码被调用,但当我运行iPad版本时,根本没有调用主AppDelegate的代码,因此没有创建managedObject,这就是错误的原因。但是为什么主AppDelegate中没有运行代码?Thx

编辑2: 以下是我的主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;
}

因此,didFinishLaunchingWithOptions在iphone和ipad版本中都被调用。iPad版本根本就不运行coredata,而iphone版本确实应该运行coredata。你知道会出什么问题吗?谢谢

如果应用程序委托未设置为应用程序的委托,则该应用程序委托可能未运行任何代码


在主NIB中查找iPad版本,确保“AppName应用程序委托”设置为该NIB文件所有者的委托。

我发现了问题。真奇怪

这是“模型存在”的代码

-(BOOL)模型存在{
NSFetchRequest*request=[[NSFetchRequest alloc]init];

request.entity=[NSEntityDescription entityForName:@“Book”inManagedObjectContext:\uu managedObjectContext];/我也遇到了同样的问题。我的应用程序在开发过程中已经运行了好几个星期,但突然由于此错误而崩溃。将managedObjectContext更改为[self-managedObjectContext]解决了问题

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


谢谢你发布这篇文章,省去了我很多时间的麻烦。

在我的项目中,我有一个导航控制器,当我试图切换到子视图控件时,我遇到了这个错误

问题是我需要通过设置managedObjectContext。这来自CoreDate主/详细示例

- (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).

iPad是否有可能在core data中存储了脏的或旧版本的数据?例如,您是否尝试从iPad中删除应用程序并重新安装以验证核心数据是否干净?Thx,但我删除了应用程序数次,并重置了模拟器,当然,创建了一个干净的buil…模型文件位于主目录中,因此一级o在ipad/iphone文件夹的顶部…我得到了新的信息。请看我编辑的问题。Thx!Thx,AppDelegate_ipad设置为文件所有者的委托,就像它设置在iphone主笔尖一样。所有内容都以与iphone端完全相同的方式连接起来。|似乎,主AppDelegate中的CoreData方法是只在iPhone版本中运行。所以CoreData在iPad版本中可能没有“激活”吗?可能是这样吗?我做了一个新项目并再次复制了所有内容,但我仍然遇到同样的问题。什么是核心数据方法?所有的“核心数据方法”都应该从
-(BOOL)应用程序:(UIApplication*)调用应用程序didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
。如果不调用该方法,则不会设置应用程序委托。我再次编辑了我的问题。正如您所看到的,didFinishLaunchingWithOptions在两个版本中都被调用。但在iPad版本中,coredata内容只是没有被调用。这可能吗?:D我仍然使用XCode 4.0。可能是个错误?我无法升级,因为我在新西兰现在。谢谢你的帮助!!
- (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];
    }
}