CoreData插入Skeins实体时丢失type与skeindesc属性如何解决
CoreData 实体属性插入丢失排查方案
- 先校验属性名一致性
核对三个位置的属性名拼写、大小写完全一致:CoreData 模型编辑器中的属性名、自动/手动生成的Skeins类中@NSManaged修饰的属性名、你业务代码中赋值的属性名。如果存在大小写差异或者拼写错误,赋值操作只会作用于Swift类的属性,不会映射到CoreData的持久化字段,自然不会出现在对象的data字段输出中。
可以直接执行代码print(sk.entity.propertiesByName.keys),查看当前实体注册的所有属性key,确认是否包含type和skeindesc。 - 检查属性访问逻辑
CoreData默认启用属性延迟加载,未被主动访问的属性不会出现在对象的打印内容中,不代表没有赋值成功。你可以在insert前增加两行代码主动访问属性,再打印对象验证:print(sk.type, sk.skeindesc) // 主动触发属性加载 - 排查模型缓存问题
如果这两个属性是后续新增到模型中的,Xcode可能存在旧模型缓存:按Cmd+Shift+KClean项目,删除设备/模拟器上的原有App后重新安装运行,排除旧缓存影响。如果是线上已发布版本新增属性,需要确认你已经开启了CoreData轻量迁移,否则旧版本App升级后新属性会被忽略。 - 校验属性约束配置
检查模型中这两个属性的配置:如果设置了非可选且无默认值,如果赋值的capitalized结果为空,CoreData会自动忽略该属性的写入。你可以断点在赋值行之后,打印type.capitalized和description.capitalized的结果,确认赋值的内容合法。
另外补充一个代码优化点:你使用Skeins(context: self.context)初始化对象时,已经默认将对象关联到了对应的上下文,不需要额外调用self.context.insert(sk),多余的调用不会产生功能影响,但可以删除简化逻辑。
内容的提问来源于stack exchange,提问作者Becky Green
相关产品推荐
相关产品推荐

