核心数据阻止保存

Core Data prevent saving

有没有办法防止根据特定条件保存特定 NSManagedObjectModel

我知道我们可以在保存前使用willSave修改对象,但是有没有办法阻止对象被保存?

override public func willSave() {

    if self.name != nil {

       // Save the object into context
    }
    else {
       // Don't save the object into context
    }
}

这个请求的原因是用户应该能够启动一个表单并插入一些值,然后他还可以转到其他屏幕并执行其他可以触发 context.save() 的操作,而我不希望在未完成的情况下保存表格。

我需要在上下文中创建此对象,因为该对象与上下文中的另一个对象有关系,如果我在上下文之外创建对象,我将需要更改所有关系的上下文。

提前致谢。

我知道你提到你不想使用不同的上下文,但使用不同的上下文确实是最好的方法。

如果您在主上下文中创建,即使不保存,数据仍然是 'in context'。分开是最安全的。 从您的主要上下文创建子上下文...

let childContext = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

childContext.parent = YOUR_MAIN_THREAD_CONTEXT

你现在使用这个子上下文创建你的NSManagedObject,如果用户没有完成就离开了,那么只需将这个上下文设置为 nil 就可以了。

如果要提交,则保存子上下文,将其推送到main,然后将主上下文保存到推送到持久存储

func commitContext(childContext: NSManagedObjectContext?) {

    do {
        try childContext?.save()
        do {
            try MainThreadMoc.save()
        } catch {
            print("Error saving parent context")
        }
    } catch {
        print("Error saving childContext")
    }
}

如果在显示表单时上下文没有未提交的更改,您可以使用 rollback() API。它

removes everything from the undo stack, discards all insertions and deletions, and restores updated objects to their last committed values.

override public func willSave() {

    if self.name != nil {
       try? context.save()
    }
    else {
       context.rollback()
    }
}