【发布时间】:2019-03-29 10:22:29
【问题描述】:
我正在尝试将核心数据中的验证设置为简单的托管对象结构。
Building 和 Floor 之间存在一对多的关系(在 Building has many 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。
有什么建议如何在插入时保存具有所需关系和验证的管理对象?
谢谢。
【问题讨论】:
-
你在调用 validateForInsert() 吗?另外,请上传您的 Floor(context:_) 方法代码。
-
我没有打电话给
validateFroInsert。它在Floor扩展名中自动调用。我在上面添加了extension部分,以明确Floor是托管对象的扩展。Floor(context:_)方法是标准的核心数据托管对象初始化器。 -
您似乎遇到了同步问题。
validationForInsert仅在保存上下文时调用。看起来它之前是由其他地方触发的。 -
不确定同步问题是什么意思。实现是非常基础的。我会添加经理以便更好地理解。
-
你确定你没有在其他地方调用保存吗?如果在将 Floor 对象分配给建筑物之前调用了保存,则可能会出现此问题。
标签: ios swift xcode validation core-data