CoreData'此NSPersistentStoreCoordinator没有持久性存储。它无法执行保存操作。'

问题描述 投票:21回答:9

我一直在遵循these说明,以帮助将iCloud支持与CoreData集成在一起,但出现一些错误。

我在我的AppDelegate中拥有这个:

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {

    if (persistentStoreCoordinator != nil) {
        return persistentStoreCoordinator;
    }

    //NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"Little_Wedding_Book_Universal.sqlite"];
    NSString *storePath = [[NSString stringWithFormat:@"%@", [self applicationDocumentsDirectory]] stringByAppendingPathComponent:@"appname.sqlite"];
    NSURL *storeURL = [NSURL fileURLWithPath:storePath];

    persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

    NSPersistentStoreCoordinator* psc = persistentStoreCoordinator;

    if (IOS_VERSION_GREATER_THAN_OR_EQUAL_TO(@"5.0"))
    {
        dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
            NSFileManager *fileManager = [NSFileManager defaultManager];

            // Migrate datamodel
            NSDictionary *options = nil;

            // this needs to match the entitlements and provisioning profile
            NSURL *cloudURL = [fileManager URLForUbiquityContainerIdentifier:@"J9VXW4WCE8.com.company.appname"];
            NSString* coreDataCloudContent = [[cloudURL path] stringByAppendingPathComponent:@"data"];
            if ([coreDataCloudContent length] != 0) {
                // iCloud is available
                cloudURL = [NSURL fileURLWithPath:coreDataCloudContent];

                options = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                           [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                           @"appname.store", NSPersistentStoreUbiquitousContentNameKey,
                           cloudURL, NSPersistentStoreUbiquitousContentURLKey,
                           nil];
            }
            else
            {
                // iCloud is not available
                options = [NSDictionary dictionaryWithObjectsAndKeys:
                           [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                           [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                           nil];
            }

            NSError *error = nil;
            [psc lock];
            if (![psc addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
            {
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
            [psc unlock];

            dispatch_async(dispatch_get_main_queue(), ^{
                NSLog(@"asynchronously added persistent store!");
                [[NSNotificationCenter defaultCenter] postNotificationName:@"RefetchAllDatabaseData" object:self userInfo:nil];
            });

        });

    }
    else
    {
        NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                                 [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
                                 [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
                                 nil];

        NSError *error = nil;
        if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:options error:&error])
        {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
    }

    return persistentStoreCoordinator;
}

[在另一个视图控制器中,我创建了AppDelegate的实例,创建了一个对象并调用[appDelegate saveContext];,这是应用程序崩溃的地方。一直以来都运行良好(到目前为止,添加了iCloud支持)。

-(void)saveContext
{
    NSError *error;
    if (managedObjectContext != nil) {
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
            // Update to handle the error appropriately.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            exit(-1);  // Fail
        }
    }
}

因此它在此方法下崩溃,并且控制台向我显示此消息:

'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'

我不知道该怎么办,帮忙!

编辑:下面的控制台日志:

启动应用程序后,我得到:

2012-08-22 17:39:47.906 appname[24351:707] asynchronously added persistent store!
2012-08-22 17:39:47.955 appname[24351:707] asynchronously added persistent store!

当应用崩溃时进行跟踪:

2012-08-22 17:41:31.657 appname[24351:707] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'
*** First throw call stack:
(0x3749d88f 0x351a2259 0x36bf0fe7 0x36c59287 0xd648b 0x149e0b 0x373f73fd 0x3118ce07 0x3118cdc3 0x3118cda1 0x3118cb11 0x3118d449 0x3118b92b 0x3118b319 0x31171695 0x31170f3b 0x33bb322b 0x37471523 0x374714c5 0x37470313 0x373f34a5 0x373f336d 0x33bb2439 0x3119fcd5 0xd53dd 0xd5378)
terminate called throwing an exception(lldb) 
iphone objective-c ipad core-data icloud
9个回答
25
投票

您可能正在从两个(或多个)不同的线程中调用persistentStoreCoordinator方法。直接或间接。

如所写,该方法不是线程安全的。

可能是您有其他方法也遇到相同的问题。通常,managedObjectContext存在并且以类似方式写入。

有两种方法可以解决此问题:

  • 使用@synchronize使这些方法成为线程安全的
  • 将初始化代码移出它们,并放入init方法中,并将其修改为断言/除非ivar为nil,>
  • 您可能还做错的第二件事是在初始化存储之前修改上下文(例如,向其中添加新的托管对象),然后尝试保存它。

要解决此问题,请确保您执行以下任一操作:

  • 除非您知道其中至少已经存在一个托管对象(这意味着商店已加载),否则不要将任何托管对象添加到上下文中>]
  • [如果您需要在不检查是否存在某个托管对象的情况下将其添加到上下文中(例如,在最初创建空存储之后),请确保该存储已被初始化(例如,在获得[C0 ]通知,您会注意到数据库为空)。

我有同样的问题,我的解决方案是删除应用程序,然后由于数据库中的修改而再次安装它。

我通过从模拟器中删除该应用并重新运行来解决了该问题。我猜是因为以前版本的应用程序没有核心数据。

通过将let moc = DataController()。managedObjectContext移动到类的顶部而不是留在func seedPerson()内部来解决

我在测试过程中看到一些错误,当我旋转一些临时RefetchAllDatabaseData而不挂在任何地方时-ARC会将上下文从我下面随机释放出去。

结束工作是在测试中保留对MOC的引用,并在每次测试时将其重置。

不确定这与非测试环境的相关性如何,但是特别是如果您使用的是子级/同级上下文,则有必要确保它们仍然存在。 :P

我有同样的问题。 原因

我收到错误消息是因为我做了一些小的CoreData Entity schema中的更改
(基本上我添加了2-3个新属性)。我忘记了它,因为在运行它之前它不会给出任何错误。因此,发生的事情是,运行较早的应用程序已经具有具有先前架构的持久性存储。因此,新架构指向同一商店。这就是为什么我们在尝试访问新属性时会提示错误的原因。

解决方案从设备/模拟器中删除应用程序。并重新安装]]。 (新版本将具有新架构,因此不会崩溃。)

重新更新。 XCODE 4.6.3和MACOSX 10.9.5:

为了解决该问题,我在xcode派生数据位置中删除了与该产品相关的应用程序目录:

rm -rd / Users // Library / Developer / Xcode / DerivedData /。显然,在使用对象模型后,数据变得混乱。

我也一直坚持这个问题。为此,我首先要检查核心数据迁移代码,因为在我的情况下该代码是正确的,所以我已经从设备中删除了我的应用,然后重新安装了它。而且有效。

[对我来说,我发现NSManagedObjectContext在我的情况下总是返回addPersistentStoreWithType。因此,持久性存储未成功创建。然后,我打印nil

storeURL

这是无效路径。所以我检查了代码,发现了一个愚蠢的错误。~/Library/Developer/CoreSimulator/Devices/1F8C6299-1F80-4212-9FE2-CA33BD365851/data/Containers/Data/Application/9CA7B7BB-A835-4BC2-B12D-23B84D420F91/Library/Documentation/my-database.sqlite

  • 我应该使用enter image description here而不是NSDocumentDirectory

  • 当我使用NSDocumentationDirectoryNSDocumentationDirectory始终尝试在NSPersistentStoreCoordinator中创建持久存储,这是无效路径。

  • 相反,正确的路径应为.../Library/Documentation/my-database.sqlite

42
投票

我有同样的问题,我的解决方案是删除应用程序,然后由于数据库中的修改而再次安装它。


3
投票

我通过从模拟器中删除该应用并重新运行来解决了该问题。我猜是因为以前版本的应用程序没有核心数据。


1
投票

通过将let moc = DataController()。managedObjectContext移动到类的顶部而不是留在func seedPerson()内部来解决


1
投票

我在测试过程中看到一些错误,当我旋转一些临时RefetchAllDatabaseData而不挂在任何地方时-ARC会将上下文从我下面随机释放出去。


1
投票

我有同样的问题。 原因


0
投票

重新更新。 XCODE 4.6.3和MACOSX 10.9.5:

为了解决该问题,我在xcode派生数据位置中删除了与该产品相关的应用程序目录:


0
投票

我也一直坚持这个问题。为此,我首先要检查核心数据迁移代码,因为在我的情况下该代码是正确的,所以我已经从设备中删除了我的应用,然后重新安装了它。而且有效。


0
投票

[对我来说,我发现NSManagedObjectContext在我的情况下总是返回addPersistentStoreWithType。因此,持久性存储未成功创建。然后,我打印nil

storeURL
© www.soinside.com 2019 - 2024. All rights reserved.