如何初始化一个新的 NSManagedObject 并在单个托管对象上下文中设置与另一个 NSManagedObject 的关系?
How do I initialize a new NSManagedObject and set a relationship to another NSManagedObject within a single managed object context?
我正在创建一个新的 NSManagedObject
并尝试与另一个 NSManagedObject
建立关系,但我收到此错误:
Illegal attempt to establish a relationship 'lift' between objects in
different contexts
我知道为什么会这样 - 我只是不知道如何解决它。
我正在调用此函数来创建新对象:
func createNewLiftEvent() -> LiftEvent {
let entity = NSEntityDescription.entityForName("LiftEvent", inManagedObjectContext: moc!)
let newLiftEvent = LiftEvent(entity: entity!, insertIntoManagedObjectContext: moc)
return newLiftEvent
}
我的 LiftEvent 实例在初始化时设置了自己的值。在 awakeFromInsert 中,调用了三个辅助方法,它们使用了一个名为 LiftEventDataManager (dataManager
) 的 class,这当然是创建我不想要的第二个 managedObjectContext 的原因:
override func awakeFromInsert() {
super.awakeFromInsert()
let defaultUnit = getDefaultWeightUnit() // returns an NSManagedObject
self.weightUnit = defaultUnit
let defaultLift = getDefaultLift() // returns an NSManagedObject
self.lift = defaultLift
let defaultFormula = getDefaultFormula() // returns an NSManagedObject
self.formula = defaultFormula
self.maxAmount = 0.0
}
这是其中一种辅助方法的示例:
func getDefaultFormula() -> Formula {
let formulasArray = dataManager.fetchSelectableFormulas() // this is what creates a new managedObjectContext
let defaultFormula = NSUserDefaults.formula().rawValue
formula = formulasArray[defaultFormula]
return formula
}
createNewLiftEvent()
函数在 LiftEventDataManager class 中,连同在上面的辅助函数中调用的 .fetchSelectableFormulas()
方法等方法。
Apple 的 Core Data Programming guide 没有说明这个特定问题,我也没有在 SO 上找到任何线程来解决初始化时的多上下文问题。
如何在 'context A' 中创建新的 LiftEventObject 并获取那些其他托管对象并将它们放入 'context A' 以便我可以设置关系?
一个选择可能是绕过您的原始 LiftEvent 对象,并让您的辅助方法使用该 LifeEvent 的 managedObjectContext 执行它们的操作(所有托管对象都有对其上下文的引用,因此您可以利用该事实)。
(可能不适用,但仅供参考,如果线程起作用,请小心。您可能还需要使用 performBlockAndWait)
我正在创建一个新的 NSManagedObject
并尝试与另一个 NSManagedObject
建立关系,但我收到此错误:
Illegal attempt to establish a relationship 'lift' between objects in different contexts
我知道为什么会这样 - 我只是不知道如何解决它。
我正在调用此函数来创建新对象:
func createNewLiftEvent() -> LiftEvent {
let entity = NSEntityDescription.entityForName("LiftEvent", inManagedObjectContext: moc!)
let newLiftEvent = LiftEvent(entity: entity!, insertIntoManagedObjectContext: moc)
return newLiftEvent
}
我的 LiftEvent 实例在初始化时设置了自己的值。在 awakeFromInsert 中,调用了三个辅助方法,它们使用了一个名为 LiftEventDataManager (dataManager
) 的 class,这当然是创建我不想要的第二个 managedObjectContext 的原因:
override func awakeFromInsert() {
super.awakeFromInsert()
let defaultUnit = getDefaultWeightUnit() // returns an NSManagedObject
self.weightUnit = defaultUnit
let defaultLift = getDefaultLift() // returns an NSManagedObject
self.lift = defaultLift
let defaultFormula = getDefaultFormula() // returns an NSManagedObject
self.formula = defaultFormula
self.maxAmount = 0.0
}
这是其中一种辅助方法的示例:
func getDefaultFormula() -> Formula {
let formulasArray = dataManager.fetchSelectableFormulas() // this is what creates a new managedObjectContext
let defaultFormula = NSUserDefaults.formula().rawValue
formula = formulasArray[defaultFormula]
return formula
}
createNewLiftEvent()
函数在 LiftEventDataManager class 中,连同在上面的辅助函数中调用的 .fetchSelectableFormulas()
方法等方法。
Apple 的 Core Data Programming guide 没有说明这个特定问题,我也没有在 SO 上找到任何线程来解决初始化时的多上下文问题。
如何在 'context A' 中创建新的 LiftEventObject 并获取那些其他托管对象并将它们放入 'context A' 以便我可以设置关系?
一个选择可能是绕过您的原始 LiftEvent 对象,并让您的辅助方法使用该 LifeEvent 的 managedObjectContext 执行它们的操作(所有托管对象都有对其上下文的引用,因此您可以利用该事实)。
(可能不适用,但仅供参考,如果线程起作用,请小心。您可能还需要使用 performBlockAndWait)