核心数据通过轻量级迁移为模型添加新的非可选属性

问题描述 投票:0回答:1

我想向当前模型添加一个新的非可选字段,并在迁移时将值设置为现有字段。

型号:

ModelV1 {
   timestamp
}

ModelV2 {
  timestamp, creationTime
}

迁移后,我想将

creationTime
设置为
timestamp
,因为它是非可选字段。我不想提供默认值,因为它是恒定的。

我做了什么:

  • 创建新版本的模型。
  • 创建映射文件 v1 -> v2
  • 在映射文件中设置creationTime -> source.timestamp

但是当我运行该应用程序时,我收到此错误:

无法就地迁移存储:验证错误,强制目标属性上缺少属性值

creationTime
不应该为空,因为我已经提供了迁移。

ios core-data
1个回答
0
投票

你所描述的应该有效。既然不是,迁移过程可能找不到映射模型。

如果您在创建映射模型后编辑了其中一个模型,则可能会发生这种情况。迁移使用模型哈希查找映射模型,编辑模型可以更改哈希。如果哈希值不匹配,即使映射模型存在,也不会被使用。

如果您这样做了,请重新创建映射模型并重试。如果没有,请尝试使用迁移调试标志来找出问题所在。您可以通过将

-com.apple.CoreData.MigrationDebug 1
添加到应用方案中的参数来完成此操作。使方案“运行”部分如下所示:

然后尝试运行模型迁移。你应该看到的是这样的:

CoreData: annotation: Incompatible version schema for persistent store '[...file URL...]'.  store metadata = {

...有关模型的很多细节...

} and current model versions = {

...当前型号的详细信息...

}
CoreData: annotation: (migration)    will attempt automatic schema migration
CoreData: annotation: (migration) found compatible mapping model [...file URL..]
CoreData: annotation: (migration)    Automatic schema migration succeeded for store at '[...file URL...]'

如果您什么也没看到,则 Core Data 无法找到您的映射模型。如果您看到与此不同的内容,请仔细阅读消息以获取有关问题的线索。如果您找不到问题,请尝试将调试标志设置的

1
更改为
2
,然后再次尝试获取有关迁移正在执行的操作的更多详细信息。

© www.soinside.com 2019 - 2024. All rights reserved.