【问题标题】:CoreData 'This NSPersistentStoreCoordinator has no persistent stores. It cannot perform a save operation.'CoreData '这个 NSPersistentStoreCoordinator 没有持久存储。它无法执行保存操作。
【发布时间】:2012-08-18 00:52:26
【问题描述】:

我一直按照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) 

【问题讨论】:

  • 在您保存上下文之前,后台线程(获取 iCloud 持久存储)是否已经完成?
  • 最好的检查方法是什么?
  • 您的代码在后台线程完成后执行NSLog(@"asynchronously added persistent store!");,因此您应该会看到。
  • 哦,是的,这几乎会在应用启动时立即显示,但在保存时,我从未看到此消息。
  • 你能显示你程序的 NSLog 输出吗?

标签: iphone objective-c ipad core-data icloud


【解决方案1】:

我有同样的问题,我的解决方案是删除应用程序并重新安装它,因为数据库中的修改。

【讨论】:

  • 你会认为现在我会记得这样做。感谢您快速提醒我!
  • 这仅适用于您尚未将应用程序放入应用商店的情况。否则,对于下载旧版本并使用新版本更新的所有用户,它将导致应用崩溃。
【解决方案2】:

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

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

可能你有其他方法有同样的问题。通常managedObjectContext 存在并且以类似的方式编写。

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

  • 使用@synchronize 使这些方法线程安全
  • 将初始化代码从它们中移出并移入 init 方法,并将它们修改为断言/除非 ivar 为 nil

您也可能做错的第二件事是修改上下文(例如向其中添加新的托管对象),然后在存储初始化之前尝试保存它。

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

  • 除非您知道其中已经至少有一个托管对象(暗示存储已加载),否则不要将任何托管对象添加到上下文中
  • 如果您需要将托管对象添加到上下文而不检查是否已经存在(例如,在您最初创建空存储之后),请确保存储已经初始化(例如,当您获得 @ 987654325@ 通知,您注意到数据库是空的)。

【讨论】:

  • 我面临与 Josh Kahane 相同的问题,但请告诉我如何在 persistentStoreCoordinator 中使用“同步”?请回复我
  • 对我来说:第二个更有可能:因为 PSContainer.loadPersistentStores { ... 只有在它调用闭包时才完成!所以立即返回可能会导致您使用尚未加载的商店(仅在第二秒内加载)
【解决方案3】:

我通过从模拟器中删除应用程序并再次运行它来解决它。我猜这是因为以前版本的应用程序没有核心数据。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我在测试期间看到了这个错误,当时我启动了一些临时的NSManagedObjectContexts 而没有在任何地方挂起它们——上下文会被 ARC 随机从我下面释放出来。

      最终的工作是在测试中保留对 MOC 的引用,并为每个测试重置它。

      不确定这与非测试环境的相关性如何,但特别是如果您使用的是子/兄弟上下文,则值得确保它们实际上仍然存在。 :P

      【讨论】:

        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

          更新重新。 XCODE 4.6.3 和 MACOSX 10.9.5:

          为了解决问题,我在xcode派生数据位置删除了与产品相关的app目录:

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

          【讨论】:

            【解决方案8】:

            我也遇到了这个问题。为此,我首先检查了核心数据迁移代码,因为在我的情况下代码是正确的,我已经从设备中删除了我的应用程序并重新安装它。它有效。

            【讨论】:

              【解决方案9】:

              对我来说,我发现 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
              

              这是一个我们无法写入数据的目录。所以我检查了我的代码,发现了一个愚蠢的错误。

              • 我应该使用NSDocumentDirectory 而不是NSDocumentationDirectory。 Xcode 中的代码完成在文档目录枚举之前提供了文档目录。

              • 当我使用 NSDocumentationDirectoryNSPersistentStoreCoordinator 总是试图在 .../Library/Documentation/my-database.sqlite 中创建持久存储,这是一个无效的路径。

              • 相反,正确的路径应该是.../Documents/BeeLocation.sqlite

              【讨论】:

                猜你喜欢
                • 2020-05-30
                • 2016-03-15
                • 2013-03-07
                • 1970-01-01
                • 2016-02-04
                • 2019-11-12
                • 1970-01-01
                • 2014-10-15
                • 2013-04-08
                相关资源
                最近更新 更多