我的问题是这样做的目的是什么,这两种方法的利弊是什么?
解决方法
正如保罗在演示之前的讲座中所说,可以通过以下方式创建一个核心数据库(在iOS5中):
>在创建新项目时,单击“使用核心数据”作为应用程序模板.
>使用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文件中创建多个数据库,您也可以等到创建/设置数据库,直到需要. “使用核心数据”选项为您提供了在应用程序加载时设置的单个核心数据库,允许您将CoreData的内容集中在AppDelegate周围,节省编码时间,并且适用于快速应用程序.我喜欢UIManagedDocument.
如果您启动了您的应用程序而未选中核心数据选项,并希望将其添加到AppDelegate,只需创建一个核心数据检查的新项目,并将所有代码复制到AppDelegate(应该只有3个属性及其访问器以及一个方便访问文件目录的方法).您将需要指向您的初始视图控制器,型号等.
更新:
只是想增加一个方便.如果您的托管对象上下文存储在您的AppDelegate中,您可以通过使用应用程序的任何位置访问它
NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext];
这不必传递它.
对于任何CoreData应用程序,如果您对模型进行了任何更改,请确保在再次构建之前手动删除模拟器中的应用程序.否则,您将在下一次构建中收到错误,因为它将使用旧文件.