CoreData 'Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ. Он не может выполнить операцию сохранения. ' - программирование
Подтвердить что ты не робот

CoreData 'Этот NSPersistentStoreCoordinator не имеет постоянных хранилищ. Он не может выполнить операцию сохранения. '

Я следил за этими инструкциями, чтобы помочь интегрировать поддержку 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.'

Я не знаю, что делать, помогите!

EDIT: Журнал консоли ниже:

При запуске приложения я получаю:

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) 
4b9b3361

Ответ 1

Вероятно, вы вызываете метод persistentStoreCoordinator из двух (или более) разных потоков. Прямо или косвенно.

Как написано, этот метод не является потокобезопасным.

Возможно, у вас есть другие методы с той же проблемой. Обычно managedObjectContext существует и записывается аналогичным образом.

Существует два способа решения этой проблемы:

  • используйте @synchronize, чтобы обеспечить безопасный поток этих методов.
  • переместите код инициализации из них и в метод init и измените их, чтобы утверждать/исключать, если ivar nil

Во-вторых, вы также можете ошибаться в том, чтобы изменить контекст (например, добавить к нему новые управляемые объекты), а затем попытаться сохранить его до инициализации хранилища.

Чтобы решить эту проблему, выполните одно из следующих действий:

  • вы не добавляете какой-либо управляемый объект в контекст, если не знаете, что в нем уже есть хотя бы один управляемый объект (подразумевая, что хранилище загружено)
  • если вам нужно добавить управляемый объект в контекст, не проверяя его там (например, после первоначального создания пустого хранилища), убедитесь, что хранилище уже инициализировано (например, сделайте это, когда вы получите RefetchAllDatabaseData и вы заметили, что база данных пуста).

Ответ 2

У меня была такая же проблема, и я решил удалить приложение и установить его снова из-за изменений в базе данных.

Ответ 3

Я решил это, удалив приложение из симулятора и запустив его снова. Я предполагаю, что это происходит потому, что предыдущая версия приложения не содержит в ней основных данных.

Ответ 4

Решено, перемещая let moc = DataController(). managedObjectContext в начало класса, а не оставляя внутри func seedPerson()

Ответ 5

Обновить повторно. XCODE 4.6.3 и MACOSX 10.9.5:

Чтобы решить проблему, я удалил каталог приложения, связанный с продуктом, в месте расположения данных xcode:

rm -rd/Пользователи//Library/Разработчик/Xcode/DerivedData/. По-видимому, данные перепутались после игры с объектной моделью.

Ответ 6

Я видел эту ошибку во время тестирования, когда я создавал временный NSManagedObjectContext, не повесив на них нигде - контекст будет освобожден из-под меня наугад ARC.

Завершение работы состояло в том, чтобы провести ссылку на MOC на тесты и reset для каждого теста.

Не уверен, насколько это актуально для условий, не связанных с тестированием, но особенно если вы используете контексты для детей/сестер, стоит убедиться, что они на самом деле все еще там.: P

Ответ 7

Я также столкнулся с этой проблемой. Для этого я сначала проверил код миграции основных данных. Так как код был верным в моем случае, я удалил свое приложение с устройства и переустановил его. И это работает.

Ответ 8

У меня была та же проблема. Причина. Я получал ошибку, потому что я внес незначительные изменения в мою схему CoreData Entity (в основном я добавил 2-3 новых атрибута). И я забыл об этом, так как он не дает никаких ошибок, пока мы его не запустим. Итак, что происходит, приложение, которое раньше выполнялось, имело постоянное хранилище с предыдущей схемой. Таким образом, новая схема указывает на тот же магазин. Вот почему мы ошибаемся при запуске, когда пытаемся получить доступ к новым атрибутам.

Решение: Удалите приложение с устройства/симулятора. И переустановите его. (Новая сборка будет иметь новую схему и, следовательно, не будет разбиваться.)