【问题标题】:NSPersistentStoreCoordinator not created on a UIManagedDocument未在 UIManagedDocument 上创建 NSPersistentStoreCoordinator
【发布时间】:2013-04-15 22:00:57
【问题描述】:

我开始了解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”的文件。

【问题讨论】:

  • 作为关于 Core Data 的一般说明,如果您将其视为数据库,从长远来看,您将受到影响。 Core Data 是一个持久性框架而不是数据库。它在某种程度上就像一个数据库,但如果你从 Core Data == 数据库的思维方式来处理它,那么会有一些细微的差异会在你背后咬你。
  • 是的,我意识到 Core Data 不是数据库,(如上所述)我更容易将 UIManagedDocument 视为数据库(对于我正在创建的应用程序)。
  • 别担心,只是想让你不走上一条我见过很多人走下坡路然后讨厌这条路的路。
  • 是的,这就是我刚开始使用 Core Data 时遇到的问题,我想这正是人们所习惯的(尤其是当我来自 MySQL/PHP 背景时)

标签: core-data icloud uimanageddocument nspersistentstore


【解决方案1】:

在使用 UIManagedDocument 时,您不应该自己创建它——这会发生在您身上。 然而在实践中并不那么可靠。在内部,UIManagedDocument 设置持久存储和持久存储协调器。 但是直到底层 iCloud 代码完成其动作、与服务器通信、下载任何新数据等之后才会发生这种情况。与此同时,您无法保存更改,因为在此之前进程完成后无处保存这些更改。

此外,有时 iCloud 会无缘无故无法协调一致,这在您的控制之下。

您可能需要检查打开完成处理程序中的success 值。如果是NO,你就有点卡住了。当 iCloud 崩溃时,除了有时之外没有其他恢复路径,如果幸运的话,您可以再试几次直到它起作用。请提交错误,我们需要 Apple 来解决这个问题。

【讨论】:

  • 谢谢,我现在就试试。我无法理解的是,开发人员要理解/成功使用 iCloud 有多难。尤其是 Apple 如何“完美”地在他们的应用程序中使用它。您可能会认为在文档和帮助方面会有更多关于如何设置 iCloud 并让它像它近 2 年的历史一样工作
  • 正如你提到的(我不知道为什么我没有想到参数)但是“成功”被记录为 NO
  • Apple 几乎没有使用 iCloudwith Core Data。 iCloud 中但没有 Core Data 的文档更可靠,但绝不是完美的,即使在 Apple 的应用程序中也是如此。
【解决方案2】:

不确定您是否曾经修复过此 Adam,但您的 persistentStore 不应该在云端。始终在本地存储中创建 uiManagedDocument,并为 addPersistentStore 设置 iCloud 选项。 CoreData 将提供一个即时存储供您的应用程序在构建真实版本时使用,并从 iCloud 获取任何数据(如果有)。完成后,它会将您切换到本地的 iCloud 连接商店。只有交易日志会发布到 iCloud,但这是在幕后为您完成的。

【讨论】:

    【解决方案3】:

    UIDocument Class Reference 中有示例代码,Core Data Programming Guide 也有。您还可以通过使用 Master-Detail 模板创建基于 Core Data 的项目来查看 Core Data 堆栈设置的示例。

    如果这是您第一次接触 Core Data,我建议您阅读有关该主题的一本书,Core Data for iOS,作者 Tim Isted 和 Tom Harrington,或者 Core Data(第 2 版):iOS、OS X 和 iCloud 的数据存储和管理,作者 Marcus Zarra。

    我看到一些看起来很奇怪的东西:

    • [self iCloudDocumentsURL] 是否指向本地文件系统?

    • 为什么将 URL 插入到书籍数组中?

    • 在假设打开成功之前测试块中的 success 变量。

    即使在 iOS 6.x 中,iCloud Core Data 也没有准备好迎接黄金时段。这当然不是新的 iOS 开发者想要解决的问题。看看 Black Pixel 非常聪明的人对他们自己的一款产品的看法:http://blackpixel.com/blog/2013/03/the-return-of-netnewswire.html

    【讨论】:

    • 您好,感谢您的回复。到目前为止,我已经构建了一个与斯坦福 CS193P 视频“iCloud”中的应用程序类似的应用程序。除了不使用 Flickr 数据,我想在创建文档后将自己的数据添加到上下文中。
    • 我也使用了文档 managedObjectContext 的save: 方法而不是[document updateChangeCount:UIDocumentChangeDone];
    • [self iCloudDocumentsURL] 本质上是[[[NSFileManager defaultManager] URLForUbiquityContainerIdentifier:nil] URLByAppendingPathComponent:@"Documents"]。一开始这让我很困惑,但是当 icloud 既可用又不可用时,这很有效。文档存储在本地,并推送到云端(我在 developer.icloud.com 上查看过)。我的集合视图使用了文档数组。该数组在设置后会导致 collectionview 重新加载。
    • 另外,当我检查云时,有一个文件夹结构'Documents'>'StoreContent',其中包含一个文件'persistentStore'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-04
    • 2012-05-25
    • 2012-05-06
    • 1970-01-01
    • 2012-08-22
    • 2012-02-06
    相关资源
    最近更新 更多