CoreData在willSave()中设置非可选值时无法保存对象
问题解答
原因分析
出现这个错误的核心原因是Core Data的属性验证时机早于willSave()的执行时机:
- 当你创建新实体并直接调用保存时,Core Data会先对所有非可选属性做合法性验证,此时
lastEditTS还是初始的nil状态,直接触发1570错误。 - 而
willSave()方法是在属性验证完成之后、实际写入持久化存储之前才会被调用,这就导致你在willSave()里的赋值根本赶不上验证环节。
补充说明:如果是修改已存在的实体(从存储中获取后修改),保存时不会触发这个问题——因为此时lastEditTS已有初始值,验证能通过,willSave()会正常更新它。
解决方法
你可以任选以下一种方案解决:
方案1:在实体初始化时赋值
重写实体的初始化方法,确保新实体创建时就给lastEditTS赋值:
public convenience init(context: NSManagedObjectContext) { let entity = NSEntityDescription.entity(forEntityName: "YourEntityName", in: context)! self.init(entity: entity, insertInto: context) lastEditTS = .now }
方案2:重写validateForInsert()方法
在插入验证前主动赋值,确保验证时属性有值:
public override func validateForInsert() throws { lastEditTS = .now try super.validateForInsert() }
方案3:创建实体时直接赋值
在你创建该实体的业务代码里,直接设置lastEditTS的值,不依赖生命周期方法:
let newEntity = YourEntity(context: managedContext) newEntity.lastEditTS = .now // 设置其他属性... try managedContext.save()
内容的提问来源于stack exchange,提问作者christophriepe
相关产品推荐
相关产品推荐

