Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/117.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用NSPersistentStoreCoordinator的意义?_Ios_Core Data - Fatal编程技术网

Ios 使用NSPersistentStoreCoordinator的意义?

Ios 使用NSPersistentStoreCoordinator的意义?,ios,core-data,Ios,Core Data,在iTunes上iPhone课程的核心数据讲座中,讲师用核心数据编写了一个示例项目,而没有使用NSPersistentStoreCoordinator,并使用NSManagedObjectModel加载它。但是在查看其他代码示例和关于iPhone开发的Big Nerd Ranch书籍时,他们正在创建一个NSManagedObjectModel和PersistentStoreCoordinator,并以这种方式设置NSManagedObjectContext 我的问题是这样做的目的是什么,两种方法

在iTunes上iPhone课程的核心数据讲座中,讲师用核心数据编写了一个示例项目,而没有使用
NSPersistentStoreCoordinator
,并使用
NSManagedObjectModel
加载它。但是在查看其他代码示例和关于iPhone开发的Big Nerd Ranch书籍时,他们正在创建一个
NSManagedObjectModel
和PersistentStoreCoordinator,并以这种方式设置
NSManagedObjectContext


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

如果没有持久性存储协调器,您将无法将结果保存到持久性区域(数据库、文件等)…因此,如果您想要一个完全无用的持久性数据管理器,请忽略NSPersistentStoreCoordinator。你确定项目没有使用它吗?教授是如何保存数据的?当您创建新的核心数据项目时,此逻辑将自动为您生成


编辑:我现在知道了,教授正在使用,它在内部使用自己的持久存储协调器(基于文件类型),因此不需要创建显式的(除非您对默认设置不满意)。因此,归根结底,问题不在于是否使用协调器,而在于是否显式创建它

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

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

  • 创建新项目时,单击应用程序模板的“使用核心数据”
  • 使用UIManagedDocument
  • 第一种方法背后的想法是,Xcode将在AppDelegate中放入一堆代码,以设置文档目录/持久存储协调器/和模型。然后,它将托管对象上下文传递给初始视图控制器(在公共API中应该有一个NSManagedObjectContext属性),从那里,当您切换到其他视图控制器时,您可以像啤酒一样传递上下文。传递上下文是访问核心数据库的正确过程

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

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

    持久存储协调器是自动为您设置的,您可以使用它的persistentStoreOptions属性(实际上,为了持久保存上下文,您需要这样做),或者通过对UIManagedDocument进行子类化并重写所需的方法来配置它

    请阅读UIManagedDocument文档中的概述

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

    如果您启动应用程序时未选中core data选项,并且希望将其添加到AppDelegate,则只需创建一个选中core data的新项目,并将所有代码复制到AppDelegate(应该只有3个属性及其访问器,以及访问documents目录的方便方法)。您需要指向初始视图控制器、模型等

    更新: 只是想增加一个方便。如果托管对象上下文存储在appDelegate中,则只需使用

    NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext];
    
    这否定了必须传递它


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

    是的,我确信教授没有使用它,但他使用[NSEntityDescription insertNewObjectForEntityForName]将对象存储在核心数据中。逻辑在哪里自动生成?我相信,谢谢你的应用程序代表。它将设置当您在上下文中调用“Save”时要使用的商店协调员。如果他没有使用这个函数,那么为什么还要处理核心数据呢……我想知道……核心数据需要一个托管对象上下文、一个托管对象模型和一个持久的存储协调器才能工作。(您引用的
    insertNewObject…
    方法将上下文作为参数,上下文需要存储,存储需要模型。)您可能在讲座中看到的是模板项目的使用——当您创建新的Xcode项目并选择“使用核心数据”时,
    AppDelegate
    实现获得了一些用于设置这些的样板代码。但是,使用核心数据而不进行数据持久化(即不保存)是可能的,有时也是可取的