gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 09:42:52 25 4
gpt4 key购买 nike

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

在我的应用程序的第 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 模型并使用该版本创建新实体,那么正如您所期望的那样,新属性是非零的,所以一切正常。它只是迁移到这个似乎没有在现有实体实例中正确创建新属性的新版本。

我们将一如既往地感谢任何人的帮助!干杯。

最佳答案

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

您之所以将此新属性值视为“nil”,是因为您很可能将其定义为“可选”属性。这意味着将它设置为 nil 是可以接受的,因此 CoreData 不会在迁移期间填充它。

只有在向数据库中插入新实体时才会使用默认值。

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

  • 将此新属性定义为非可选属性(简单明了)。

或者 - 如果您真的需要将此属性保留为可选属性(不过,根据您的问题,我怀疑情况是否如此,而且,这并不是真正最干净的解决方案):

  • 执行“内容迁移”的方式如下:
    • 检测您何时从版本 2 迁移到版本 3(您可以使用存储元数据来跟踪/保留当前内容的“版本”编号)。
    • 查询所有现有条目,并根据需要填充数据。

或者:

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

关于ios - 在 Core Data 轻量级迁移到添加了新属性的版本之后,该属性为 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24438187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com