我想向当前模型添加一个新的非可选字段,并在迁移时将值设置为现有字段。
型号:
ModelV1 {
timestamp
}
ModelV2 {
timestamp, creationTime
}
迁移后,我想将
creationTime
设置为 timestamp
,因为它是非可选字段。我不想提供默认值,因为它是恒定的。
我做了什么:
但是当我运行该应用程序时,我收到此错误:
无法就地迁移存储:验证错误,强制目标属性上缺少属性值
creationTime
不应该为空,因为我已经提供了迁移。
你所描述的应该有效。既然不是,迁移过程可能找不到映射模型。
如果您在创建映射模型后编辑了其中一个模型,则可能会发生这种情况。迁移使用模型哈希查找映射模型,编辑模型可以更改哈希。如果哈希值不匹配,即使映射模型存在,也不会被使用。
如果您这样做了,请重新创建映射模型并重试。如果没有,请尝试使用迁移调试标志来找出问题所在。您可以通过将
-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
,然后再次尝试获取有关迁移正在执行的操作的更多详细信息。