Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.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
Swift addPersistentStoreWithType到底在做什么?_Swift_Core Data - Fatal编程技术网

Swift addPersistentStoreWithType到底在做什么?

Swift addPersistentStoreWithType到底在做什么?,swift,core-data,Swift,Core Data,调用NSPersistentStoreCoordinator对象的addPersistentStoreWithType方法时,到底发生了什么 通过查看web上的示例,我发现调用此方法会将给定URL处的持久性存储添加到我们的持久性存储协调器,对吗 我的主要问题是,如果: 在给定的URL上还没有持久存储?它是不是通过调用此方法自动为我们创建的?还是我们必须做点别的 如果给定的URL上已经有一个存储,它是被替换的还是其他什么?如果数据模型发生更改(例如,如果向托管类添加新属性),会发生什么情况 谢

调用
NSPersistentStoreCoordinator
对象的
addPersistentStoreWithType
方法时,到底发生了什么

通过查看web上的示例,我发现调用此方法会将给定URL处的持久性存储添加到我们的持久性存储协调器,对吗

我的主要问题是,如果:

  • 在给定的URL上还没有持久存储?它是不是通过调用此方法自动为我们创建的?还是我们必须做点别的
  • 如果给定的URL上已经有一个存储,它是被替换的还是其他什么?如果数据模型发生更改(例如,如果向托管类添加新属性),会发生什么情况

谢谢大家!

如果给定URL上没有存储,CoreData将创建它,并根据与持久存储协调器关联的managedObjectModel添加相关表

如果给定URL上有一个存储,CoreData将进行检查以确保它与模型一致。如果不是,则(默认情况下)CoreData将抛出错误:

用于打开存储的模型与用于创建存储的模型不兼容

当人们开始构建和设计CoreData应用程序时,这是一个常见的问题。该阶段最简单的解决方案就是从模拟器中删除应用程序(删除现有的应用商店)并重新运行。但对于生产应用程序来说,这不是一个可行的解决方案,因为生产应用程序需要在保留用户数据的同时适应模型的设计更改。为了解决这个问题,CoreData支持一个模型的多个版本,并且有一个广泛的API用于从一个模型版本迁移到另一个模型版本。有关完整信息,请参阅


对于许多模型更改,可以使用“轻量级迁移”。有关使用轻量级迁移的良好示例,请参阅。

虽然没有完整描述,但可以,此方法“将在给定URL处的持久存储添加到我们的持久存储协调器”

除此之外,它还创建了一个或多个扩展名为.xml/.sqlite/.bin/custom的数据文件

为了更容易地说明持久性存储和持久性存储协调器是如何协同工作的,让我们将对象看作表(尽管从技术上讲,它在大多数情况下都不是表!)

  • 托管对象模型(MOM)是框架/主模板(任何单词!)表,它描述实体描述,仅包括3个事项:(实体)名称、(实体)属性和(实体)关系

  • 持久对象存储(POS)表是持久存储数据文件的对象存在形式。它被称为托管对象

  • 持久存储协调器(PSC)通过将MOM和POS组合到一个格式良好、结构良好的数据中来完成惊人的任务。从技术上讲,PSC从POS检索数据并将其构造为MOM定义的格式表

  • 一旦调用方法
    addPersistentStoreWithType
    ,PSC将执行一个还原过程:引用MOM并将POS从对象提取到持久存储的数据文件中,并另存为脚本、二进制或某些存储方法。从Xcode 7开始,每次调用anyInstanceOfNSManagedObjectContext.save()抛出时,编译器都会自动为您保存持久存储。这意味着除非您有多个持久存储,否则不必使用
    addPersistentStoreWithType


  • 希望这对您有所帮助

    您可以尝试一下。在Xcode中创建一个新项目并运行两次。