在iTunes的 Stanford 193P iPhone课程的Core Data演讲中,教练用Core Data编写了一个示例项目,而不使用NSPersistentStoreCoordinator并将其加载到NSManagedobjectModel中.但是,在其他代码示例和Big Nerd Ranch的iPhone开发书上,他们正在创建一个NSManagedobjectModel和PersistentStoreCoordinator,并以这种方式设置NSManagedobjectContext.

我的问题是这样做的目的是什么,这两种方法的利弊是什么?

解决方法

我非常密切地跟着同一个讲座系列.这个特定的例子从Flickr中提取数据(摄影师和照片),并将它们加载到CoreData中.在这个应用程序中使用CoreData并不是真的有必要,因为它需要在每个应用程序加载时从flickr获取新数据,所以没有必要保存.由于学生已经熟悉了该教程,所以该教授只是使用前面演示中的flickr提取应用程序作为起点(允许他专注于解释CoreData).然而,正如里克斯提到的那样,使用核心数据而不会将上下文保存到磁盘中有很大的好处.

正如保罗在演示之前的讲座中所说,可以通过以下方式创建一个核心数据库(在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应用程序,如果您对模型进行了任何更改,请确保在再次构建之前手动删除模拟器中的应用程序.否则,您将在下一次构建中收到错误,因为它将使用旧文件.

ios – 使用NSPersistentStoreCoordinator的点?的更多相关文章

  1. 详解前端HTML5几种存储方式的总结

    本篇文章主要介绍了前端HTML5几种存储方式的总结 ,主要包括本地存储localstorage,本地存储sessionstorage,离线缓存(application cache),Web SQL,IndexedDB。有兴趣的可以了解一下。

  2. PhoneGap / iOS上的SQLite数据库 – 超过5mb可能

    我误解了什么吗?Phonegap中的sqlitedbs真的有5mb的限制吗?我正在使用Phonegap1.2和iOS5.解决方法您可以使用带有phonegap插件的原生sqliteDB,您将没有任何限制.在iOS5.1中,Websql被认为是可以随时删除的临时数据…

  3. ios – 多个NSPersistentStoreCoordinator实例可以连接到同一个底层SQLite持久性存储吗?

    我读过的关于在多个线程上使用CoreData的所有内容都讨论了使用共享单个NSPersistentStoreCoordinator的多个NSManagedobjectContext实例.这是理解的,我已经使它在一个应用程序中工作,该应用程序在主线程上使用CoreData来支持UI,并且具有可能需要一段时间才能运行的后台获取操作.问题是NSPersistentStoreCoordinator会对基础

  4. ios – CoreData有序关系 – 使用NSFetchRequest批量取消

    或者,是否存在批量不支持的API,它不是私有的?解决方法目前我有一个解决方案,但不是一个干净的解决方案:我希望按照有序关系中的20个小组进行批量修改.所以,每次我索引一个索引,它的索引除以20,我为接下来的20使用新的NSFetchRequest,并通过调用公共字段名称来解除它们.

  5. ios – 使用SQLite和CoreData进行批量插入

    我有一个使用sqlite作为持久性存储的CoreData模型.在对每条记录进行一些处理之后,我需要插入大量的行.有没有办法将这些命令发送到sqlite我需要加快处理时间,因为它需要几个小时才能完成.任何提示将不胜感激.谢谢解决方法将商店添加到商店协调员时,可以指定编译指示:(改编自PersistentStoreFeatures)我强烈建议您阅读“有效导入数据”.相关文档:NSSQLitePragm

  6. 核心数据 – iOS:由于Xcode 9中的Fetched Indexes,无法编译CoreData模型

    根据发行说明,Xcode9增加了对获取索引的支持:“ThedatamodeleditorpresentsaunifiedinterfaceforCoreData’snewfetchindexesfeatureaswellasitsexistingpropertyindexandentitycompoundindexfeatures.Olderdatamodelsaretranslatedintof

  7. 如何在Cocoa中使用Bindings CoreData实现iTunes风格的Source-List?

    让我们说,为了说明,我在Cocoa中编写了一个iTunes克隆应用程序,该应用程序由CoreData支持.为简化起见,假设有两个“部分”,“图书馆”,包括音乐,电影,广播等.第二部分称为“播放列表”,其中包含用户生成的播放列表.所以SourceList本身通常会用NSOutlineView实现,这通常很简单.源列表的“库”部分实际上并不包含用户生成的任何内容,只包含应用程序的“功能”(实质上),其中“播放列表”部分仅包含用户创建的自定义列表.如何用Bindings和CoreData做到这一点?

  8. ios – 未为测试目标生成核心数据类

    我使用CoreData的自动生成的类.除测试目标外,我的项目还有3个目标.对于每个目标,正确生成CoreData类,我通过检查DerivedData文件夹进行验证.但是,尽管在核心数据模型文件中打勾,但不会为测试目标生成类.当我尝试引用测试目标中的一个CoreData类时,这会导致“未声明的标识符”和“使用未声明的类型”错误.我该如何解决这个问题?

  9. ios – 领域:如何获取数据库的当前大小

    是否有RealmAPI方法使用RealmSwift作为数据存储来获取我的RealmSwift应用程序的当前数据库大小?

  10. ios – 尽管匹配x-coredata id,“CoreData不支持持久的跨店关系”

    有关AbstractSource,我在源代码中没有触摸/控制?我是通过调用来创建Quote和BookinitWithEntity:insertIntoManagedobjectContexteach.)>我注意到错误描述还包括几个“相对的”x-coredataid(形式为“x-coredata:///……”如果是这样,我怎么能影响“绝对”和“绝对”之间的任何选择“相对”x-coredataid?

随机推荐

  1. iOS实现拖拽View跟随手指浮动效果

    这篇文章主要为大家详细介绍了iOS实现拖拽View跟随手指浮动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

  2. iOS – genstrings:无法连接到输出目录en.lproj

    使用我桌面上的项目文件夹,我启动终端输入:cd然后将我的项目文件夹拖到终端,它给了我路径.然后我将这行代码粘贴到终端中找.-name*.m|xargsgenstrings-oen.lproj我在终端中收到此错误消息:genstrings:无法连接到输出目录en.lproj它多次打印这行,然后说我的项目是一个目录的路径?没有.strings文件.对我做错了什么的想法?

  3. iOS 7 UIButtonBarItem图像没有色调

    如何确保按钮图标采用全局色调?解决方法只是想将其转换为根注释,以便为“回答”复选标记提供更好的上下文,并提供更好的格式.我能想出这个!

  4. ios – 在自定义相机层的AVFoundation中自动对焦和自动曝光

    为AVFoundation定制图层相机创建精确的自动对焦和曝光的最佳方法是什么?

  5. ios – Xcode找不到Alamofire,错误:没有这样的模块’Alamofire’

    我正在尝试按照github(https://github.com/Alamofire/Alamofire#cocoapods)指令将Alamofire包含在我的Swift项目中.我创建了一个新项目,导航到项目目录并运行此命令sudogeminstallcocoapods.然后我面临以下错误:搜索后我设法通过运行此命令安装cocoapodssudogeminstall-n/usr/local/bin

  6. ios – 在没有iPhone6s或更新的情况下测试ARKit

    我在决定下载Xcode9之前.我想玩新的框架–ARKit.我知道要用ARKit运行app我需要一个带有A9芯片或更新版本的设备.不幸的是我有一个较旧的.我的问题是已经下载了新Xcode的人.在我的情况下有可能运行ARKit应用程序吗?那个或其他任何模拟器?任何想法或我将不得不购买新设备?解决方法任何iOS11设备都可以使用ARKit,但是具有高质量AR体验的全球跟踪功能需要使用A9或更高版本处理器的设备.使用iOS11测试版更新您的设备是必要的.

  7. 将iOS应用移植到Android

    我们制作了一个具有2000个目标c类的退出大型iOS应用程序.我想知道有一个最佳实践指南将其移植到Android?此外,由于我们的应用程序大量使用UINavigation和UIView控制器,我想知道在Android上有类似的模型和实现.谢谢到目前为止,guenter解决方法老实说,我认为你正在计划的只是制作难以维护的糟糕代码.我意识到这听起来像很多工作,但从长远来看它会更容易,我只是将应用程序的概念“移植”到android并从头开始编写.

  8. ios – 在Swift中覆盖Objective C类方法

    我是Swift的初学者,我正在尝试在Swift项目中使用JSONModel.我想从JSONModel覆盖方法keyMapper,但我没有找到如何覆盖模型类中的Objective-C类方法.该方法的签名是:我怎样才能做到这一点?解决方法您可以像覆盖实例方法一样执行此操作,但使用class关键字除外:

  9. ios – 在WKWebView中获取链接URL

    我想在WKWebView中获取tapped链接的url.链接采用自定义格式,可触发应用中的某些操作.例如HTTP://我的网站/帮助#深层链接对讲.我这样使用KVO:这在第一次点击链接时效果很好.但是,如果我连续两次点击相同的链接,它将不报告链接点击.是否有解决方法来解决这个问题,以便我可以检测每个点击并获取链接?任何关于这个的指针都会很棒!解决方法像这样更改addobserver在observeValue函数中,您可以获得两个值

  10. ios – 在Swift的UIView中找到UILabel

    我正在尝试在我的UIViewControllers的超级视图中找到我的UILabels.这是我的代码:这是在Objective-C中推荐的方式,但是在Swift中我只得到UIViews和CALayer.我肯定在提供给这个方法的视图中有UILabel.我错过了什么?我的UIViewController中的调用:解决方法使用函数式编程概念可以更轻松地实现这一目标.

返回
顶部