Core Data轻量迁移:新增非可选属性映射已有字段报错求助
Core Data 迁移非可选字段报错的解决方法
1. 检查映射文件的表达式格式
- 确认
creationTime的Value Expression必须写成$source.timestamp,前缀$是Core Data映射表达式引用源属性的必填语法,漏写会导致无法正确获取源字段值,进而触发非可选字段为空的验证错误。 - 确认目标模型中
creationTime的Optional选项未勾选,且映射文件中该属性未设置默认值(保持绑定源属性的配置)。
2. 配置正确的迁移选项
启动时必须明确开启自动迁移,并关闭自动映射推断(因为使用了自定义映射文件),示例代码:
let persistentContainer = NSPersistentContainer(name: "YourModel") guard let storeDescription = persistentContainer.persistentStoreDescriptions.first else { fatalError("Failed to retrieve store description") } // 开启自动迁移 storeDescription.setOption(true as NSNumber, forKey: NSMigratePersistentStoresAutomaticallyOption) // 关闭自动推断映射模型,强制使用自定义的.xcmappingmodel文件 storeDescription.setOption(false as NSNumber, forKey: NSInferMappingModelAutomaticallyOption) persistentContainer.loadPersistentStores { (_, error) in if let error = error as NSError? { // 打印详细错误信息排查问题 print("Migration error: \(error)") print("Error user info: \(error.userInfo)") fatalError("Unresolved migration error") } }
3. 排查源数据与实体配置问题
- 检查源模型(ModelV1)的
timestamp字段是否为非可选,若源数据中存在timestamp为nil的记录,迁移时会导致creationTime无法获取有效值,触发验证错误。需先清理这类无效数据。 - 确认自定义映射文件(.xcmappingmodel)已添加到项目Target的Copy Bundle Resources中,否则App运行时无法加载该映射规则。
4. 调试获取详细错误信息
在迁移错误的回调中打印error.userInfo,里面会包含具体的错误实体、属性甚至记录ID,能精准定位是哪个环节导致的字段为空问题。
内容的提问来源于stack exchange,提问作者H4SN
相关产品推荐
相关产品推荐

