在iTunes上的Stanford 193P iPhone课程的核心数据讲座中,讲师使用核心数据编写了一个示例项目,没有使用NSPersistentStoreCoordinator
并使用NSManagedObjectModel
加载它。但在查看其他代码示例和关于iPhone开发的Big Nerd Ranch书籍时,他们正在创建一个NSManagedObjectModel
和PersistentStoreCoordinator并以此方式设置NSManagedObjectContext
。
我的问题是这样做的目的是什么,这两种方法的优点和缺点是什么?
答案 0 :(得分:19)
我非常密切地关注同一系列讲座。这个特殊的例子从Flickr中提取数据(摄影师和照片)并将它们加载到CoreData中。在这个应用程序中没有必要使用CoreData,因为它需要在每次应用程序加载时从flickr获取新数据,因此持久保存没有意义。教授只是使用上一个演示中的flickr抓取应用程序作为起点,因为学生已经熟悉它(允许他专注于解释CoreData)。但是,正如rickster所说,使用核心数据而不将上下文保存到磁盘有很大的好处。
正如保罗在演示前的讲座中所解释的那样,可以通过以下方式创建核心数据库(在iOS5中):
第一种方法背后的想法是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应用程序,如果您对模型进行任何更改,请确保在再次构建之前手动删除模拟器中的应用程序。否则,您将在下一次构建时收到错误,因为它将使用旧文件。
答案 1 :(得分:7)
如果没有持久性存储协调器,您将无法将结果保存到持久区域(数据库,文件等)...因此,如果您想要一个完全没用的持久数据管理器,那么省略NSPersistentStoreCoordinator。你确定该项目没有使用它吗?教授如何保存数据?创建新的Core Data项目时,将为您自动生成此逻辑。
编辑:我现在得到了,教授正在使用UIManagedDocument,它在内部使用自己的持久存储协调器(基于文件类型),因此不需要创建一个明确的(除非你不是满意默认)。所以,最后,它不是关于是否使用协调器,而是你是否明确地创建它。