获取NSManagedObjectContext的所有子上下文

时间:2013-02-22 12:30:43

标签: iphone core-data magicalrecord

在核心数据模型中,有三个实体ABC,其中A可以与B和/或{{ 1}}。

由于某些原因,CB正在C上下文的子上下文(它们共享相同的子上下文)中创建。因此,一个父上下文(由A使用)具有一个子上下文(由AB使用)。< / p>

现在我需要

  1. 获取所有C
  2. 获取所有A s(或B s)。
  3. 我正在使用MagicalRecord与CoreData进行交互,因此(1)很容易实现:

    C

    为了实现(2),我现在可以使用我知道NSArray *all_As = [A findAll]; 的上下文:

    A

    其中NSManagedObjectContext *contextOfA = a.managedObjectContext a的实例。请注意,由于我的应用设计方式,总有一个A可用于获取所有aB个实例(换句话说:我不需要在没有C的情况下访问BC。如上所述,AA(以及B)之间不一定存在关系。最后,C甚至不必存在(ab可以在没有c的情况下生存。

    但我知道,aB生活在C的儿童背景中。

    所以基本上我只需要获取A的子上下文并对该子上下文执行获取请求:

    a.managedObjectContext

    如何访问NSArrray *all_Bs = [B findAllInContext: a.managedObjectContext.childContext]

2 个答案:

答案 0 :(得分:0)

你不能简单地称之为吗?

NSArray *all_Bs = [B findAll]; 
如果没有提及,MR应该能够自己处理上下文。

如果这不起作用 - 您无法预测它是否会使用第三方框架 - 为什么不简单地保留对您的子环境的引用并在获取B时使用它?

(为什么你会使用MR这样的东西超出我的范围。一旦你真正使用核心数据的高级功能,它确实会使事情变得复杂得多。)

答案 1 :(得分:0)

我找到了解决问题的方法:

在我的AppDelegate中,我放了一个变量NSManagedObjectContext *tempObjectContext;。当我现在添加A对象时,我将其添加到此tempObjectContext

正如我在原始帖子中所述,添加新的aB对象时,此C会永久存在。但BC无需与a建立关系。因此,我也将BC个对象添加到tempObjectContext中。

现在,当我想要保存BC个对象时,我会将其保存到[NSManagedObjectContext defaultContext]并从tempObjectContext中删除它们:

B *finalObject = [B createInContext:[NSManagedObjectContext defaultContext]];
NSDictionary *attributes = [[B entityDescription] attributesByName];
[finalObject setValuesForKeysWithDictionary:[self.temp dictionaryWithValuesForKeys:[attributes allKeys]]];

[[NSManagedObjectContext defaultContext] insertObject:finalObject];

[self.mainDelegate.tempObjectContext deleteObject:self.temp];

那么,为什么我要这么做呢?简单:当我将所有ABC放入同一个对象中,然后创建a之后b,我无法保存b未保存a(因为他们都在相同的背景下抵制)。使用单独的上下文解决了这个问题。