在Core Data轻量级迁移到添加了新属性的版本后,该属性为nil

时间:2014-06-26 19:02:13

标签: ios core-data migration

我正在尝试在应用的核心数据中设置一些测试轻量级迁移,但我遇到了一些奇怪的问题。

在我的应用程序的版本2和版本3之间,我刚刚添加了一个新的integer32属性。该属性的默认值设置为0(每当你创建一个新属性时Xcode都会创建默认值。我已尝试将新属性设置为可选或不可用来测试此问题,它没有任何区别。

我使用Xcode自动生成我的NSManagedObject子类,其中包含我添加的新属性。

我正在使用UIManagedDocument加载我的核心数据文件,并将其设置为执行自动迁移

NSDictionary *docOptions = @{
                        NSMigratePersistentStoresAutomaticallyOption : @YES,
                        NSInferMappingModelAutomaticallyOption : @YES
                        };
self.document.persistentStoreOptions = docOptions;

我将当前文档设置为版本2时生成一组实时数据,然后将应用程序更改为版本3.我运行它并且文档成功打开,因此我假设迁移已正常运行。当它失败时,不确定如何从中获取任何错误,我的日志中没有任何内容。

一旦我尝试实际访问我添加的CoreData实体实例的NSManagedObject子类的新属性的NSNumber属性,我发现该属性为nil,而不是默认值为0的NSNumber。

我可以在此找到的所有教程,文档和问题似乎都没有说我应该做任何其他工作来实现这一点。

如果我干净地使用版本3模型并使用该版本创建新实体,那么您可能希望新属性为非零,因此一切正常。它只是迁移到这个新版本,似乎没有在现有实体实例中正确创建新属性。

任何人的帮助将一如既往地受到赞赏!欢呼声。

1 个答案:

答案 0 :(得分:4)

这实际上相当简单,但可能有点不直观。

您认为此新属性值为' nil'是因为你很可能把它定义为一个可选的'属性。这意味着将它设置为nil是可以接受的,因此CoreData在迁移期间不会填充它。

默认值仅在将新实体插入数据库时​​才会生成。

我看到几种可能的解决方案:

  • 将此新属性定义为非可选(简单且干净)。

或者 - 如果你真的需要保持这个属性是可选的(那么,根据你的问题,我怀疑是这样的,同样,这不是一个最干净的解决方案):

  • 执行内容迁移'就是这样:
    • 检测从第2版迁移到第3版的时间(您可以使用商店元数据来跟踪/保留当前内容"版本"数字)。
    • 查询所有现有条目,并根据需要填充数据。

或者:

  • 使用比轻量级迁移更高级的迁移机制。