13

在 iTunes 上斯坦福 193P iPhone 课程的 Core Data 讲座中,讲师使用 Core Data 编写了一个示例项目,而没有使用NSPersistentStoreCoordinator和加载NSManagedObjectModel. 但是在查看其他代码示例和关于 iPhone 开发的 Big Nerd Ranch 书籍时,他们正在创建一个NSManagedObjectModelPersistentStoreCoordinator 并以NSManagedObjectContext这种方式进行设置。

我的问题是这样做的目的是什么,两种方法的优缺点是什么?

4

2 回答 2

19

我非常密切地关注同一个系列讲座。这个特定的示例从 Flickr 中提取数据(摄影师和照片)并将它们加载到 CoreData。在这个应用程序中使用 CoreData 并不是真的必要,因为它需要在每次应用程序加载时从 flickr 获取新数据,因此持久保存没有意义。教授只是使用上一个演示中的 flickr fetching 应用程序作为起点,因为学生已经熟悉它(让他专注于解释 CoreData)。然而,正如 rickster 所提到的,使用核心数据而不将上下文保存到磁盘有巨大的好处。

正如 Paul 在演示之前的讲座中解释的那样,可以通过以下方式创建一个核心数据库(在 iOS5 中):

  1. 在创建新项目时单击应用模板的“使用核心数据”。
  2. 使用 UIManagedDocument

第一种方法背后的想法是 Xcode 将在 AppDelegate 中放置一堆代码来设置您的文档目录/持久存储协调器/和模型。然后它将托管对象 CONTEXT 传递给您的初始视图控制器(它应该在公共 API 中具有 NSManagedObjectContext 属性),并且当您与其他视图控制器进行连接时,您可以从那里像一瓶啤酒一样传递上下文。传递上下文是访问核心数据库的正确过程。

使用 UIManagedDocument 非常相似,只是您的 AppDelegate 是单独的。您使用应用程序文档目录中的 URL 路径创建 UIManagedDocument(可能在初始视图控制器中)(注意:您必须手动检查文件是否已退出、存在但未打开或不存在)。然后你可以像上面一样使用这个文档的上下文。

另一个注意事项:最好在 AppDelegate 中创建指向上下文的指针,以便在应用程序崩溃或终止时显式保存上下文(仅当它准备好时!)。

持久存储协调器会自动为您设置,您可以使用它的 persistentStoreOptions 属性(实际上您需要这样做以持久保存上下文)或通过子类化 UIManagedDocument 并覆盖所需的方法来配置它。

阅读 UIManagedDocument 文档中的概述 http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.html

这两种方法的工作方式相同,并为您提供相同的控制和访问。使用 UIManagedDocuments,您可以在多个 sqlite 文件中创建多个数据库,您也可以等待创建/设置数据库,直到需要它。“使用核心数据”选项为您提供了一个在应用程序加载时设置的单一核心数据库,允许您围绕 AppDelegate 集中 CoreData 内容,节省编码时间,并且有利于快速跟踪应用程序。我喜欢 UIManagedDocument。

如果您在没有检查核心数据选项的情况下启动应用程序并希望将其添加到 AppDelegate,只需创建一个检查核心数据的新项目并将所有代码复制到您的 AppDelegate(应该只是 3 个属性及其访问器以及访问文档目录的便捷方法)。您将需要指向您的初始视图控制器、模型等。

更新:只是想增加另一种便利。如果您的托管对象上下文存储在您的 appDelegate 中,您可以在应用程序的任何位置访问它,只需使用

NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext];

这否定了必须传递它。

对于任何 CoreData 应用程序,如果您对模型进行任何更改,请确保在再次构建之前手动删除模拟器中的应用程序。否则,您将在下一次构建时收到错误,因为它将使用旧文件。

于 2012-05-31T14:51:55.390 回答
7

如果没有持久存储协调器,您将无法将结果保存到持久区域(数据库、文件等)……因此,如果您想要一个完全无用的持久数据管理器,请忽略 NSPersistentStoreCoordinator。您确定该项目没有使用它吗?教授是如何保存数据的?当你创建一个新的 Core Data 项目时,这个逻辑会自动为你生成。

编辑:我现在明白了,教授正在使用UIManagedDocument,它在内部使用自己的持久存储协调器(基于文件类型),因此无需创建显式协调器(除非您对默认值不满意)。所以,归根结底,这与是否使用协调器无关,而是您是否明确创建它。

于 2012-05-24T01:14:55.223 回答