iOS核心数据中的多个上下文

时间:2015-11-18 15:31:25

标签: ios objective-c core-data

关于在我的应用中的核心数据中创建托管对象上下文,我有几个问题,如果你能帮忙请...

为了简化,请说我的应用程序是实体街和另一个实体House。每个Street对象都有各种属性,包括House对象的属性houseList(NSArray)(可转换类型)。如果我不介绍House实体并且只为Street提供Core Data,那么一切正常,我可以保存上下文,加载给定街道中的所有House对象等。

但是当我为House创建一个实体(我将它保存在与街道相同的MOC中)并运行setHouseList时,下次启动应用程序时,我得到通常的错误“ CoreData:错误:失败在NSManagedObject类'House'上调用指定的初始化程序“。以下是我的问题......

  1. 这种情况是否意味着我有不同的线程在玩?为无知道歉,但根据我的理解,这里没有后台线程进行并行更新,所以理想情况下这些不是单独的线程,因此我不应该要求单独的托管对象上下文。

  2. 我甚至尝试在app委托中声明一个新的MOC属性,并将其传递给调用setHouseList的视图控制器,然后还保存了这个新MOC中的所有House对象。这也没有帮助,我得到同样的错误。

  3. 我怀疑如果我使用新的MOC,我可能必须在调用setHouseList时使用ObjectID,但不知何故无法理解如何做到这一点...我已经进一步完成{{3 }}和https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/CoreData/Concurrency.html链接,但没有取得任何进展......任何输入都将非常感谢!

  4. 谢谢!

1 个答案:

答案 0 :(得分:2)

您确实应该在HouseStreet个实体之间设置多对多关系,其中一个Street可以有多个与此关联的House个。{/ p >

如果订单很重要(我认为它不会是这样),那么你可以将关系建模为NSOrderedSet,尽管NSSet听起来就好像这样就好了情况下。

class Street: NSManagedObject {
    @NSManaged var houses: NSOrderedSet
}

class House: NSManagedObject {
    @NSManaged var street: Street
}

然后,当您创建对象时,在street上设置House属性,并将House添加到houses上的Street集上{1}}。

func addHouse(house: House) {
    let houses = self.mutableSetValueForKey("houses")
    houses.addObject(house)
}

核心数据将从那里处理休息。