使用 NSPersistentStoreCoordinator 的要点是什么?

2024-03-22

在核心数据讲座中斯坦福193P http://www.stanford.edu/class/cs193p/cgi-bin/drupal/iTunes 上的 iPhone 课程,讲师使用 Core Data 编写了一个示例项目,而没有使用NSPersistentStoreCoordinator并加载它NSManagedObjectModel。但在查看其他代码示例和有关 iPhone 开发的 Big Nerd Ranch 书籍时,他们正在创建一个NSManagedObjectModel和 PersistentStoreCoordinator 并设置NSManagedObjectContext那样。

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


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

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

  1. 创建新项目时单击应用程序模板的“使用核心数据”。
  2. 使用 UI 托管文档

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

使用 UIManagedDocument 非常相似,只是您的 AppDelegate 不受影响。您使用应用程序文档目录中的 URL 路径创建一个 UIManagedDocument(可能在您的初始视图控制器中)(注意:您必须手动检查文件是否已存在、存在但未打开或不存在)。然后您可以按照与上面相同的方式使用该文档的上下文。

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

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

阅读 UIManagedDocument 文档中的概述http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.html 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 应用程序,如果您对模型进行任何更改,请确保在再次构建之前手动删除模拟器中的应用程序。否则,您将在下一个构建中收到错误,因为它将使用旧文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NSPersistentStoreCoordinator 的要点是什么? 的相关文章

随机推荐