CoreData'这个NSPersistentStoreCoordinator没有持久存储.它无法执行保存操作.

Jos*_*ane 21 iphone core-data objective-c ipad icloud

我一直在按照这些说明来帮助将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;
}
Run Code Online (Sandbox Code Playgroud)

在另一个视图控制器中,我创建了一个我的实例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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

所以它崩溃了这个方法,控制台给了我这个消息:

'NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores.  It cannot perform a save operation.'
Run Code Online (Sandbox Code Playgroud)

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

编辑:控制台日志如下:

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

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!
Run Code Online (Sandbox Code Playgroud)

应用程序崩溃后跟进:

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) 
Run Code Online (Sandbox Code Playgroud)

edz*_*o27 42

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

  • 这仅适用于您尚未将应用程序推入应用商店的情况.否则,它将解析为下载以前版本并使用新版本更新的所有用户的崩溃应用程序. (3认同)

Ana*_*ile 24

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

如上所述,该方法不是线程安全的.

您可能有其他方法遇到同样的问题.通常managedObjectContext存在并以类似的方式编写.

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

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

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

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

  • 除非您知道其中至少已有一个托管对象(暗示存储已加载),否则不会向上下文添加任何托管对象
  • 如果您需要将托管对象添加到上下文而不检查是否已存在(例如,在您最初创建空商店之后),请确保该商店已经初始化(例如,当您收到RefetchAllDatabaseData通知并且您注意到时,请执行此操作)数据库是空的).


sur*_*rga 5

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