使用NSPersistentStoreCoordinator的一点?

在来自Stanford 193P iPhone课程的Core Data讲座中,讲师使用Core Data编写了一个示例项目,而不使用NSPersistentStoreCoordinator并使用NSManagedObjectModel加载它。 但是在查看iPhone开发的其他代码示例和Big Nerd Ranch书籍时,他们正在创build一个NSManagedObjectModel和PersistentStoreCoordinator,并以这种方式设置NSManagedObjectContext

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

我非常仔细地跟着同一个讲座系列。 这个特殊的例子从Flickr中提取数据(摄影师和照片)并将它们加载到CoreData中。 在这个应用程序中使用CoreData并不是必须的,因为它需要在每个应用程序负载上从flickr获取新数据,因此没有必要持久地保存。 这位教授刚刚使用前一个演示的flickr抓取应用程序作为起点,因为学生已经熟悉了(让他专注于解释CoreData)。 但是,正如rickerster所说,使用核心数据而不将上下文保存到磁盘上有很大的好处。

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

  1. 创build新项目时,单击“使用核心数据”作为应用程序模板。
  2. 使用UIManagedDocument

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

使用UIManagedDocument是非常相似的,除了你的AppDelegate是孤立的。 您可以使用应用程序文档目录中的URLpath创buildUIManagedDocument(可能位于您的初始视图控制器中)(注意:您必须手动检查文件是否已经存在,是否存在但是未打开或不存在)。 然后你可以像上面一样使用这个文档的上下文。

另一个注意:在你的AppDelegate中创build一个指向你的上下文的指针是一个好主意,所以当应用程序崩溃或终止时,你可以明确地保存你的上下文(只有当它准备就绪!)。

持久性存储协调器是为您自动设置的,您可以使用它的persistentStoreOptions属性来configuration它(事实上,您将需要为了持久保存上下文),或者通过inheritanceUIManagedDocument并覆盖所需的方法。

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

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

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

更新:只是想添加一个其他的便利。 如果您的托pipe对象上下文存储在您的appDelegate中,则只需使用即可在应用程序中的任意位置访问它

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

这否定了必须传递它。

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

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

编辑:我现在得到它,教授使用UIManagedDocument ,它使用自己的持久性存储协调员在内部(基于文件types),所以没有必要创build一个明确的(除非你不满意的默认)。 所以,最后,它不是关于是否使用协调器,而是你是否明确地创build它。