具有强制关系的NSManagedObject

时间:2012-01-30 18:05:05

标签: objective-c core-data entity-relationship nsmanagedobject nsmanagedobjectcontext

托管对象是否可以与'optional'取消关联?

如果是这样,如何在没有validateForInsert的情况下插入它:失败? 我希望关系是强制性的,但是在插入之前我无法在当前和另一个对象之间建立连接,因为我要连接的两个对象位于不同的上下文中。

具体示例: 我一般有一个MOC。假设我在上下文中保存了Person 现在我想创建一个新的,所以我实例化一个Person但是将它插入到上下文中。当用户从某个表视图中选择兄弟并设置'brother'属性时,反向关系将尝试在MOC中保存的对象与MOC中不存在的对象之间建立连接,这将导致应用程序崩溃。
我的问题:如果'兄弟'关系是可选的,我是否可以创建并插入新人?

2 个答案:

答案 0 :(得分:0)

我的理解是,上下文用于分享对持久存储的更改的共同意识。您可以有两个上下文引用同一个持久性存储。

因此,例如,如果您有NSFetchedResultsController,则可以使其接收托管对象上下文已更改的通知。您可能有两个持久存储,因此您可以限制有关某些更改的通知。 (一个简单的,也许不太现实的例子是一个上下文中的搜索结果列表,但是另一个上下文中的收藏夹列表。你的应用程序可以通过使其成为收藏夹来更改结果列表中的一个项目。你可能只想要那个通知转到收藏夹列表及其获取结果控制器所指的上下文,假设结果列表不受影响。所以两个上下文在这里有意义。但两个上下文都引用相同的持久存储。)

更重要的是,如果在两个上下文中引用的对象包含在同一个持久性存储中,它们仍然具有完整的所有关系以及管理这些关系的过程。

所以我不明白你的陈述,即对象在不同的​​语境中。你能更具体一点吗?

答案 1 :(得分:0)

对我自己这个愚蠢的问题。

当然,您可以将对象插入上下文而不会导致错误。然后,您可以设置(强制)关系 只有在实际尝试保存上下文时才会验证关系和属性。

然而,在我的应用程序中,直到'NewItemVC'完成后我才插入实体。我调用了-validateForInsert:在正在创建的对象上检查它是否有效启用/禁用完成按钮。
由于我不能在没有插入的情况下建立强制关系,这不是一个好主意,我想要一些新的东西。