1

我的应用程序使用CoreData框架,我想检查商店元数据和托管对象模型之间的兼容性。我做标准的方式:

BOOL isModelCompatible = [model isConfiguration:nil
                    compatibleWithStoreMetadata:metadata];

它返回NO。但是,元数据中的实体与模型中的实体相同。相同数量的实体和每个实体具有相同的名称。然而,自从使用此模型创建商店以来,模型确实发生了变化,我删除了一个实体中的几个属性。我想知道这是否足以让模型与商店元数据不兼容。我查看了官方文档,它说:

This method compares the version information in the store metadata with the entity versions of a given configuration

问题(当我阅读 Apple 的文档时经常发生这种情况)是我不太确定这句话的确切含义。那么任何人都可以解释更多关于该主题的信息吗?鉴于元数据中的实体与模型中的相同,如何CoreData确定模型是否与元数据兼容?

4

1 回答 1

1

只要存在影响数据在数据文件中存储方式的差异,模型就与持久存储不兼容。删除属性将符合条件,因为该更改会影响数据在 SQLite 中的保存方式。某些更改不会导致不兼容——例如,如果您将关系从可选更改为必需——因为无论哪种方式,数据文件都是相同的。

如果您想获得确切的详细信息,请查看NSEntityDescription相关类的 versionHash 属性。这将告诉您确切使用了什么,任何未提及的内容都不会影响兼容性。例如NSEntityDescription它包括

影响持久性的值是:实体的名称、超实体的版本散列(如果存在)、实体是否是抽象的,以及属性的所有版本散列。

要从那里继续,请查找相同的属性NSPropertyDescription及其子类。

Core Data 的模型迁移通过更新持久存储以匹配新的数据模型来克服不兼容的问题。通常这可以自动完成,就像轻量级迁移一样。删除属性将允许轻量级迁移。

于 2016-03-18T16:58:09.067 回答