在 CoreData 中保存操作值导致错误

Posted

技术标签:

【中文标题】在 CoreData 中保存操作值导致错误【英文标题】:saving manipulated values in CoreData causing error 【发布时间】:2018-04-07 04:31:23 【问题描述】:

我在core-data 中有一个名为Record 的实体。问题是我在操作后无法保存对象,如下所示:

extension Records 
@nonobjc public class func createFetchRequest() -> NSFetchRequest<Records> 
    return NSFetchRequest<Records>(entityName: "Records")


@NSManaged public var datetime: Date
@NSManaged public var year: Int64
@NSManaged public var month: Int16

public override func willSave() 
    super.willSave()

    if (self.datetime != nil) 

        self.year = Int64(datetime.year())
        self.month = Int16(datetime.month())
    



extension Date 
    func month() -> Int 
        let month = Calendar.current.component(.month, from: self)
        return month
    

    func year() -> Int 
        let year = Calendar.current.component(.year, from: self)
        return year
    

这是我遇到的错误信息:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Failed to process pending changes before save.  The context is still dirty after 1000 attempts.  Typically this recursive dirtying is caused by a bad validation method, -willSave, or notification handler.

【问题讨论】:

【参考方案1】:

来自Apple Documentation:

如果你想更新一个持久的属性值,你应该 通常测试任何新值与现有值是否相等 在做出改变之前。 如果您使用标准更改属性值 访问器方法,Core Data 会观察结果变化 通知,因此在保存对象的之前再次调用 willSave 托管对象上下文。如果继续修改 willSave 中的某个值, willSave 将继续被调用,直到您的程序崩溃。

所以在wilSave方法的情况下,在保存self.yearself.month时重新检查是否需要分配。否则在不检查的情况下为它们分配值将使willSave 再次被调用。

//your code
public override func willSave() 
    super.willSave()

        guard let dettime = datetime else 
            return
        

        if self.year != Int64(datetime.year()) 
            self.year = Int64(datetime.year())
        

        if self.month != Int64(datetime.month()) 
            self.month = Int16(datetime.month())
        
    
// your code

【讨论】:

此代码导致错误“无法使用类型为 '(() -> Int)' 的参数列表调用类型 'Int64' 的初始化程序 这只是类型转换错误,我只是从您的代码中复制过来的。我刚刚对您的代码添加了额外的检查,这样willSave 就不会一遍又一遍地调用。

以上是关于在 CoreData 中保存操作值导致错误的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 Core Data - 无法保存关系值

Core Data 后台处理,保存不推送到主上下文

Core Data 没有第一次保存

Core Data 首次启动时将数据保存到错误的数据库中

在 Core Data 中保存一组自定义类

将 mogenerator 与 Core Data 实体一起使用会导致保存数据存储时出错