我正在尝试在应用的核心数据中设置一些测试轻量级迁移,但我遇到了一些奇怪的问题。
在我的应用程序的版本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模型并使用该版本创建新实体,那么您可能希望新属性为非零,因此一切正常。它只是迁移到这个新版本,似乎没有在现有实体实例中正确创建新属性。
任何人的帮助将一如既往地受到赞赏!欢呼声。
答案 0 :(得分:4)
这实际上相当简单,但可能有点不直观。
您认为此新属性值为' nil'是因为你很可能把它定义为一个可选的'属性。这意味着将它设置为nil是可以接受的,因此CoreData在迁移期间不会填充它。
默认值仅在将新实体插入数据库时才会生成。
我看到几种可能的解决方案:
或者 - 如果你真的需要保持这个属性是可选的(那么,根据你的问题,我怀疑是这样的,同样,这不是一个最干净的解决方案):
或者: