什么是addPersistentStoreWithType完全正在做什么?

时间:2016-08-17 22:22:31

标签: swift core-data

调用addPersistentStoreWithType对象的NSPersistentStoreCoordinator方法时,究竟发生了什么?

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

我的主要问题是如果发生了什么:

  • 在给定的网址上还没有持久存储?它是通过调用此方法自动创建的吗?或者我们还要做别的事吗?
  • 如果给定的网址上已有商店,是替换还是其他什么?如果数据模型更改会发生什么(例如,如果向托管类添加新属性)。

谢谢!

2 个答案:

答案 0 :(得分:2)

如果给定的URL上没有商店,CoreData将创建它,根据与持久性商店协调员关联的managedObjectModel添加相关表。

如果给定URL存在商店,CoreData将检查以确保它与模型一致。如果没有,则(默认情况下)CoreData将抛出错误:

  

用于打开商店的模型与用于创建商店的模型不兼容

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

对于许多模型更改,您可以使用"轻量级迁移"。有关使用轻量级迁移的一个很好的示例,请参阅this answer

答案 1 :(得分:0)

虽然没有完全描述,但是,这个方法“会将给定URL的持久存储添加到我们的持久存储协调器”

更重要的是,它会创建一个或多个扩展名为.xml / .sqlite / .bin / custom

的数据文件

为了便于说明Persistent Store&持久性商店协调员一起工作,让对象视为表格(虽然在大多数情况下技术上不是表格!)

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

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

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

  4. 一旦调用方法addPersistentStoreWithType,PSC将执行恢复过程:引用MOM并将POS从Object提取到Persistent Store的数据文件中并保存为Script,Binary或某些存储方法。从Xcode 7开始,每次调用anyInstanceOfNSManagedObjectContext.save() throw时,编译器都会自动为您保存持久存储。这意味着除非您有多个持久性商店,否则addPersistentStoreWithType不是必须的。

  5. 希望这对你有帮助