在没有用户知道的情况下使用coredata进行动态shcema更改

时间:2016-06-21 12:33:22

标签: ios objective-c core-data core-data-migration

您好,我是Objective-c Coredata的新手

以下是该方案。 我有一个模型说车辆,其属性为 name noOfWheels 。我在我的应用程序中对此模型执行CRUD操作。在应用程序启动时,我进行服务调用以检查模型是否更改。如果模型有变化,比如
1)新的属性公司已添加到车辆模型和
2)添加了一个名为公司的新模型,其中包含 name country 等属性。

是否有可能以编程方式读取这些更改并在用户不知道更新的情况下更改我的架构?

我已经在coredata中进行了轻量级迁移,但他们说我们需要使用xcode创建其他xcdatamodel,然后以编程方式更改应用程序中的版本。

PS:我不想重新发布应用作为更新。想要同步进行。

1 个答案:

答案 0 :(得分:0)

这不是不可能的,但它远非易事。您在模型编辑器中所做的一切都可以在代码中完成,但它会变得难看。

  • 您可以修改模型。请注意,例如entities上的NSManagedObjectModel属性是可读/写的,因此您可以更改它。 propertiesNSEntityDescription属性也是如此。
  • 如果您确实更改了模型,则绝对必须在加载任何数据之前进行这些更改。加载数据后,您必须考虑修复模型,因为如果您进行了新的更改,您的应用会崩溃。
  • 如果更改模型,还必须使用模型迁移。如果修改后的模型与持久性存储文件中的内容不匹配,则必须进行迁移。

核心数据的设计理念是假设您拥有的固定数据模型不需要比更新应用程序更频繁地进行更改。它希望您可以很好地规划数据模型以使其工作。如果你不能这样做,有几种可能性包括:

  1. 不要使用Core Data,直接使用SQLite。如果更新表,SQLite并不在意。核心数据对许多人来说都很方便,但它不是SQL,而SQL可能就是你所需要的。
  2. 不是尝试在代码中修改数据模型,而是创建修改后的版本并将 上传到您的服务器。不要告诉应用程序添加新属性或实体 - 让应用程序下载新版本的数据模型。您仍然需要进行模型迁移。
  3. 无论你如何处理它,都会动态地改变数据模型。假设你添加了你提到的Company信息。然后怎样呢?您的代码不知道如何处理它,那么您甚至拥有该数据会有什么不同?您无法在不更改代码的情况下充分利用新数据,并且无法在不更新应用的情况下更改代码。