具有强制关系的 NSManagedObject
Posted
技术标签:
【中文标题】具有强制关系的 NSManagedObject【英文标题】:NSManagedObject with mandatory relationship 【发布时间】:2012-01-30 18:05:05 【问题描述】:托管对象是否可以与未选中的“可选”建立关系?
如果是这样,我如何在没有 validateForInsert: 失败的情况下插入它? 我希望关系是强制性的,但在插入之前我无法在当前对象和另一个对象之间建立连接,因为我要连接的两个对象位于不同的上下文中。
具体例子:
我通常有一个 MOC。假设我在上下文中保存了一个Person
。
现在我想创建一个新的,所以我实例化了一个Person
,但是不将它插入到上下文中。当用户从某个表视图中选择一个兄弟并设置“兄弟”属性时,反向关系将尝试在 MOC 中保存的对象与 MOC 中尚不存在的对象之间建立连接,这将导致应用程序崩溃。我的问题:如果“兄弟”关系不是是可选的,我什至可以创建并插入一个新人吗?
【问题讨论】:
请说明您如何初始化您所指的每个 NSManagedObjects。您应该使用initWithEntity:insertIntoManagedObjectContext:
方法进行初始化,该方法立即将对象与托管对象上下文相关联(但不会将其保存到持久存储)
我就是这么做的。不过请检查我的答案,我已经解决了这个问题。感谢您的帮助。
【参考方案1】:
我的理解是,上下文用于共享对持久存储更改的共同认识。您可以有两个上下文引用同一个持久存储。
因此,例如,如果您有一个 NSFetchedResultsController,您可以让它接收托管对象上下文已更改的通知。您可能有两个持久存储,因此您可以限制有关某些更改的通知。 (一个简单且可能不太现实的示例是一个上下文中的搜索结果列表,但另一个上下文中的收藏列表。您的应用可以通过将其设为收藏来更改结果列表中的项目。您可能只想要那个通知转到收藏夹列表及其获取的结果控制器所指的上下文,假设结果列表无论如何都不会受到影响。所以这里有两个上下文是有意义的。但两个上下文都引用同一个持久存储。)
更重要的是,如果在两个上下文中引用的对象包含在同一个持久存储中,它们的所有关系和管理这些关系的过程仍然完好无损。
所以我不明白您关于对象 a 位于不同上下文中的说法。能具体点吗?
【讨论】:
再次检查我的问题,我添加了一个示例。【参考方案2】:问我自己真是个愚蠢的问题。
当然,您可以将对象插入上下文而不会导致错误。然后,您可以设置(强制)关系。 只有在实际尝试保存上下文时才会验证关系和属性。
然而,在我的应用程序中,直到“NewItemVC”完成,我才插入实体。我在正在创建的对象上调用了 -validateForInsert: 以检查它是否有效,启用/禁用完成按钮。 由于不插入就无法建立强制关系,所以这不是一个好主意,我得想点新办法。
【讨论】:
以上是关于具有强制关系的 NSManagedObject的主要内容,如果未能解决你的问题,请参考以下文章
instanceof的使用以及与引用类型的强制类型转换的关系