NSPersistentStoreCoordinator не создан в UIManagedDocument

Я начинаю узнавать о UIManagedDocument и его способности. Из того, что я понимаю, это форма базы данных, которая хранится в папке в каталоге документов.

Во всяком случае, я пытаюсь использовать его в качестве базы данных, храня данные в его NSManagedObjectContext однако через несколько секунд создания UIManagedDocument и сохранение данных в контекст (после того, как я угадаю время ожидания), приложение вылетает, и оно говорит мне, что нет постоянного координатора магазина.

Похоже, что в документации Apple нет большого руководства по созданию постоянного координатора магазина после создания управляемого документа.

Как мне сделать это точно?

Спасибо!

редактировать

Код, который я использую:

NSURL *url = [[self iCloudDocumentsURL] URLByAppendingPathComponent:nameOfDocument];

NSMutableArray *books = [self.books mutableCopy];
[books addObject:url];

[self setBooks:books];

UIManagedDocument *document = [[UIManagedDocument alloc] initWithFileURL:url];

NSDictionary *options = @{ NSMigratePersistentStoresAutomaticallyOption : @YES,
                           NSInferMappingModelAutomaticallyOption : @YES,
                           NSPersistentStoreUbiquitousContentNameKey : document.fileURL.lastPathComponent,
                           NSPersistentStoreUbiquitousContentURLKey : [self iCloudCoreDataLogFilesURL] };
[document setPersistentStoreOptions:options];

if (document.documentState == UIDocumentStateClosed) {
    [document openWithCompletionHandler:^(BOOL success) {
        Book *book = [Book newBookWithTitle:bookTitle
                     inManagedObjectContext:document.managedObjectContext];

        [document updateChangeCount:UIDocumentChangeDone];
    }];
}

Обновить

После выполнения этого кода в фоновом потоке. Мое приложение по-прежнему регистрирует "НЕТ" для успешного завершения обработчика завершения после открытия документа. Однако мое приложение не падает, вместо этого я получаю следующий журнал:

2013-04-23 00:01:08.381 Notable[193:4b0b] -[_PFUbiquityRecordsImporter rollResponseOperation:encounteredAnError:whileTryingToAdoptBaseline:](1545): CoreData: Ubiquity:  <PFUbiquityBaselineRollResponseOperation: 0x1fa561d0> localPeerID: mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A, storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B, modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=
    ubiquityRootLocation: <PFUbiquityLocation: 0x1e59b790>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs

Encountered an error while trying to respond to the roll of baseline: <PFUbiquityBaseline: 0x1e54deb0>(0)
    permanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip
    safeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A
    currentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip

    storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B
    modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=
    baselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip

Error: Error Domain=NSCocoaErrorDomain Code=134310 "The operation couldn’t be completed. (Cocoa error 134310.)" UserInfo=0x1f8d2ae0 {baseline=<PFUbiquityBaseline: 0x1e54deb0>(0)
    permanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip
    safeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A
    currentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip

    storeName: A-B893A0AB-B764-42F1-9402-38790DCEF96B
    modelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=
    baselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip
, localStoreKV=<PFUbiquityKnowledgeVector: 0x1f8220c0> ()}
userInfo: {
    baseline = "<PFUbiquityBaseline: 0x1e54deb0>(0)\n\tpermanentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n\tsafeLocation: <PFUbiquityLocation: 0x1f8eb1b0>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/mobile.2DDB96C5-A317-5BE5-8F29-9F5E6681A27A\n\tcurrentLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n\n\tstoreName: A-B893A0AB-B764-42F1-9402-38790DCEF96B\n\tmodelVersionHash: NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=\n\tbaselineArchiveLocation: <PFUbiquityLocation: 0x1f8e7120>: /private/var/mobile/Library/Mobile Documents/my~app~identifier/Logs/.baseline/A-B893A0AB-B764-42F1-9402-38790DCEF96B/NK3BysbustJxxyi2O8bX8eof15YimkUnegxqX6HDkas=/baseline.zip\n";
    localStoreKV = "<PFUbiquityKnowledgeVector: 0x1f8220c0> ()";
}

Этот метод также создает "DocumentMetaData.plist" (который, я считаю, необходим в соответствии с этими файлами, упомянутыми в видео CS193P, о котором я упоминал в комментарии) вместо файла под названием "persistentStore".

3 ответа

Вы не должны создавать его самостоятельно при использовании UIManagedDocument- это происходит для вас. Однако на практике это не так надежно. Внутренне UIManagedDocument устанавливает постоянное хранилище и координатор постоянного хранилища. Но этого не произойдет, пока базовый код iCloud не завершит свою работу, не будет разговаривать с сервером, загружать какие-либо новые данные и т. Д. Между тем вы не можете сохранить изменения, потому что до тех пор, пока этот процесс не завершится, их некуда сохранить. изменения.

Кроме того, иногда iCloud не справляется со своей задачей без какой-либо причины, которая находится под вашим контролем.

Вам, вероятно, нужно проверить success значение в вашем открытом обработчике завершения. Если это NO Застрял. Когда iCloud отключается, пути восстановления нет, разве что, если вам повезет, вы можете просто повторить попытку несколько раз, пока он не заработает. Ошибки в файлах, пожалуйста, нам нужен Apple, чтобы это исправить.

Не уверен, что вы когда-нибудь исправили этот Адам, но ваш persistentStore не должен находиться в облаке. Всегда создавайте uiManagedDocument в локальном хранилище и просто устанавливайте параметры iCloud для addPersistentStore. CoreData предоставит немедленное хранилище для вашего приложения для использования, пока оно создает реальную версию и получает любые данные из iCloud, если таковые имеются. После этого он переключится на подключенное хранилище ICloud, которое также является локальным. В iCloud размещаются только журналы транзакций, но это сделано для вас.

Пример кода приведен в Справочнике по классам UIDocument, а также в Руководстве по программированию основных данных. Вы также можете увидеть пример настройки стека базовых данных, создав проект на основе базовых данных с использованием шаблона Master-Detail.

Если это ваш первый опыт работы с Core Data, я предлагаю вам изучить одну из книг по этой теме: " Core Data для iOS " Тима Истеда и Тома Харрингтона или " Core Data" (2-е издание): "Хранение данных и управление для iOS"., OS X и iCloud, автор Маркус Зарра.

Я вижу пару вещей, которые выглядят странно:

  • Есть ли [self iCloudDocumentsURL] указать на локальную файловую систему?

  • Почему URL-адрес вставляется в массив книг?

  • Проверьте success переменная в вашем блоке, прежде чем предположить, что открытие успешно.

Даже в iOS 6.x iCloud Core Data не готова к прайм-тайму. Это, конечно, не то, что новый разработчик iOS хочет решить. Посмотрите, что очень умные люди из Black Pixel сказали об этом в отношении одного из своих собственных продуктов: http://blackpixel.com/blog/2013/03/the-return-of-netnewswire.html.

Другие вопросы по тегам