无法使用nil模型创建NSPersistentStoreCoordinator [英] Cannot create an NSPersistentStoreCoordinator with a nil model

查看:115
本文介绍了无法使用nil模型创建NSPersistentStoreCoordinator的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的第一次破解Core Data,我在我的设备上运行我的代码时收到以下错误,但它在模拟器上正常工作。


* 由于未捕获异常NSInvalidArgumentException而终止应用程序,原因:无法使用nil模型创建NSPersistentStoreCoordinator


我的一些方法可能导致问题:

   - (NSManagedObjectContext * )managedObjectContext 
{
if(__managedObjectContext!= nil)
{
return __managedObjectContext;
}

NSPersistentStoreCoordinator * coordinator = [self persistentStoreCoordinator];
if(coordinator!= nil)
{
__managedObjectContext = [[NSManagedObjectContext alloc] init];
[__managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return __managedObjectContext;
}

/ **
返回应用程序的托管对象模型。
如果模型不存在,则从应用程序的模型创建。
* /
- (NSManagedObjectModel *)managedObjectModel
{
if(__managedObjectModel!= nil)
{
return __managedObjectModel;
}
NSURL * modelURL = [[NSBundle mainBundle] URLForResource:@RugbyOnTvwithExtension:@momd];
__managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return __managedObjectModel;
}

/ **
返回应用程序的持久存储协调器。
如果协调器不存在,则会创建它并将应用程序的存储添加到其中。
* /
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if(__persistentStoreCoordinator!= nil)
{
return __persistentStoreCoordinator;
}

NSString * storePath = [[self applicationDocumentsDirectory] ​​stringByAppendingPathComponent:@RugbyOnTV.sqlite];

NSURL * storeUrl = [NSURL fileURLWithPath:storePath];

NSDictionary * options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],NSMigratePersistentStoresAutomaticallyOption,[NSNumber numberWithBool:YES],NSInferMappingModelAutomaticallyOption,nil];
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

NSError * error = nil;
__persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];


if(![__ persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:& error]){

NSLog(@Unresolved错误%@,%@,错误,[错误userInfo]);
abort();
}

return __persistentStoreCoordinator;
}


- (NSString *)applicationDocumentsDirectory {

NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
NSString * basePath =([paths count]> 0)? [paths objectAtIndex:0]:nil;
return basePath;
}

EDIT


我从Apple的CoreDataBooks复制和粘贴了managedObjectContext方法(下面),现在工作。不确定为什么

   - (NSManagedObjectModel *)managedObjectModel {
if(managedObjectModel!= nil){
return managedObjectModel;
}
managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
return managedObjectModel;
}


解决方案

消息作为原始帖子。我摔了几个小时。
这是我的AppDelegate.m中的这一行。

  NSURL * modelURL = [[NSBundle mainBundle] URLForResource:@ [same with name of xcdatamodeld]withExtension:@momd]; 

对于任何人搜索此错误消息并找到此主题....尝试这个第一。 / p>

你必须确保它在[与xcdatamodeld的名称相同] ....它是!
由于某种原因,我的项目名称存在,而不是数据模型名称。



更改了它, / p>

感谢Rock& Muller贡献.......你救了我几天!



Gaz。


Been having my first crack at Core Data and I'm getting the following error when running my code on my device, but it works fine on the simulator..

* Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Cannot create an NSPersistentStoreCoordinator with a nil model'

Some of my methods that might be causing the problem:

    - (NSManagedObjectContext *)managedObjectContext
{
    if (__managedObjectContext != nil)
    {
        return __managedObjectContext;
    }

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (coordinator != nil)
    {
        __managedObjectContext = [[NSManagedObjectContext alloc] init];
        [__managedObjectContext setPersistentStoreCoordinator:coordinator];
    }
    return __managedObjectContext;
}

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created from the application's model.
 */
- (NSManagedObjectModel *)managedObjectModel
{
    if (__managedObjectModel != nil)
    {
        return __managedObjectModel;
    }
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"RugbyOnTv" withExtension:@"momd"];
    __managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];    
    return __managedObjectModel;
}

/**
 Returns the persistent store coordinator for the application.
 If the coordinator doesn't already exist, it is created and the application's store added to it.
 */
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
    if (__persistentStoreCoordinator != nil)
    {
        return __persistentStoreCoordinator;
    }

    NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"RugbyOnTV.sqlite"];

    NSURL *storeUrl = [NSURL fileURLWithPath:storePath];

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];    
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

    NSError *error = nil;
    __persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];


    if (![__persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {

        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    }    

    return __persistentStoreCoordinator;
}


    - (NSString *)applicationDocumentsDirectory {

        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
        return basePath;
    }

EDIT

I copied and pasted the managedObjectContext method (below) from Apple's CoreDataBooks and it now works..Not really sure why though

- (NSManagedObjectModel *)managedObjectModel {
    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

解决方案

I had exactly the same error message as the original post. I was wrestling with this for hours. It was this line in my AppDelegate.m.

NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"[same with name of xcdatamodeld]" withExtension:@"momd"];

For anyone out there searching this error message and finding this thread....try this first.

You must make sure that where it says [same with name of xcdatamodeld]....that it is!!! For some reason, mine had my project name in there and not the data model name.

Changed it and it worked straight away.....

Thanks to Rock & Muller for contributing.......you saved me days!!

Gaz.

这篇关于无法使用nil模型创建NSPersistentStoreCoordinator的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆