gpt4 book ai didi

ios - 核心数据插入验证 (validateForInsert) 过早触发?

转载 作者:行者123 更新时间:2023-11-28 05:44:25 24 4
gpt4 key购买 nike

我正在尝试将核心数据中的验证设置为简单的托管对象结构。

有一个 BuildingFloor 并且两者之间是一对多的关系(在 Building 上有很多 Floors)。

Floor 中的验证器如下所示

// extension of auto generated managed object (Floor)
extension Floor {
override public func validateForInsert() throws {
try super.validateForInsert()
if (self.building == nil) {
throw ValidationError.missingBuilding("a floor requires a building")
}
}
}

还有我简单的测试经理:

import Foundation
import CoreData

class ObjectNodeManager {

let persistentContainer: NSPersistentContainer!

init(container: NSPersistentContainer) {
self.persistentContainer = container
self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true
}

lazy var backgroundContext: NSManagedObjectContext = {
return self.persistentContainer.newBackgroundContext()
}()

func insertObjectNode(objectNode: ObjectNode) -> ObjectNode? {
backgroundContext.insert(objectNode)
return objectNode
}

func save() {
if backgroundContext.hasChanges {
do {
try backgroundContext.save()
} catch {
fatalError("save error \(error)")
}
}
}
}

当我尝试创建保存新建筑物和楼层时出现异常。

let building = Building(context: manager.backgroundContext)
let floor = Floor(context: manager.backgroundContext)
floor.building = building // VALIDATION EXCEPTION!

// a basic backgroundContext.save() (persistentContainer) in the manager
manager.save()

使用 validationForInsert 我不可能插入/保存托管对象。或者,我可以使用 validationForUpdate,但这为时已晚,因为我不想存储与 Building 没有适当关系的 Floor

关于如何在插入时保存具有所需关系和验证的管理对象有什么建议吗?

谢谢。

最佳答案

manager.background 上下文总是返回一个新的上下文,您的buildingfloor 存在于两个不同的上下文中。

let backgroundContext = manager.backgroundContext
let building = Building(context: backgroundContext)
let floor = Floor(context: backgroundContext)
floor.building = building
manager.save()

关于ios - 核心数据插入验证 (validateForInsert) 过早触发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55415269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com