我有几个关于在我的应用程序的核心数据中创建托管对象上下文的问题,如果你能帮忙,请...
为简化起见,假设我的应用程序是一个实体 Street 和另一个实体 House。每个Street对象都有各种属性,包括House对象的一个属性houseList(NSArray)(Transformable类型)。如果我不引入 House 实体并且只有 Street 的核心数据,一切正常,我可以保存上下文,加载给定街道中的所有 House 对象等。
但是当我为 House 创建一个实体(我将它保存在与 Street 相同的 MOC 中)并运行 setHouseList 时,下次我启动应用程序时,我会收到常见的错误“CoreData: error: Failed在 NSManagedObject 类“House”上调用指定的初始化程序”。以下是我对此的疑问...
这种情况是否也意味着我有不同的线索在起作用?为无知而道歉,但根据我的理解,这里没有后台线程执行并行更新,因此理想情况下,这些线程不是单独的线程,因此我不应该需要单独的托管对象上下文。
我什至尝试在应用程序委托(delegate)中声明一个新的 MOC 属性,并将其传递给调用 setHouseList 的 View Controller ,然后还将所有 House 对象保存在这个新的 MOC 中。这也没有帮助,我得到了同样的错误。
我怀疑如果我使用新的 MOC,我可能必须在调用 setHouseList 时使用 ObjectID,但不知何故我无法理解如何做到这一点...我进一步研究了 https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Concurrency.html和 https://www.cocoanetics.com/2012/07/multi-context-coredata/链接但没有取得任何进展...任何意见将不胜感激!
谢谢!
最佳答案
你真的应该在 House
之间建立一对多关系和 Street
实体,其中一个 Street
可以有很多House
es与之相关。
如果顺序很重要(我想它不会很重要),那么您可以将关系建模为 NSOrderedSet
, 虽然NSSet
听起来在这种情况下就好了。
class Street: NSManagedObject {
@NSManaged var houses: NSOrderedSet
}
class House: NSManagedObject {
@NSManaged var street: Street
}
然后,当您创建对象时,设置 street
House
上的属性(property)并添加 House
到 houses
的集合在 Street
上.
func addHouse(house: House) {
let houses = self.mutableSetValueForKey("houses")
houses.addObject(house)
}
核心数据将处理那里的其余部分。
关于ios - iOS 核心数据中的多个上下文,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33784088/