在核心数据模型中,有三个实体A
,B
和C
,其中A
可以与B
和/或{{ 1}}。
由于某些原因,C
和B
正在C
上下文的子上下文(它们共享相同的子上下文)中创建。因此,一个父上下文(由A
使用)具有一个子上下文(由A
和B
使用)。< / p>
现在我需要
C
和A
s(或B
s)。我正在使用MagicalRecord与CoreData进行交互,因此(1)很容易实现:
C
为了实现(2),我现在可以使用我知道NSArray *all_As = [A findAll];
的上下文:
A
其中NSManagedObjectContext *contextOfA = a.managedObjectContext
是a
的实例。请注意,由于我的应用设计方式,总有一个A
可用于获取所有a
个B
个实例(换句话说:我不需要在没有C
的情况下访问B
和C
。如上所述,A
和A
(以及B
)之间不一定存在关系。最后,C
甚至不必存在(a
和b
可以在没有c
的情况下生存。
但我知道,a
和B
生活在C
的儿童背景中。
所以基本上我只需要获取A
的子上下文并对该子上下文执行获取请求:
a.managedObjectContext
但如何访问NSArrray *all_Bs = [B findAllInContext: a.managedObjectContext.childContext]
?
答案 0 :(得分:0)
你不能简单地称之为吗?
NSArray *all_Bs = [B findAll];
如果没有提及,MR应该能够自己处理上下文。
如果这不起作用 - 您无法预测它是否会使用第三方框架 - 为什么不简单地保留对您的子环境的引用并在获取B
时使用它?
(为什么你会使用MR这样的东西超出我的范围。一旦你真正使用核心数据的高级功能,它确实会使事情变得复杂得多。)
答案 1 :(得分:0)
我找到了解决问题的方法:
在我的AppDelegate
中,我放了一个变量NSManagedObjectContext *tempObjectContext;
。当我现在添加A
对象时,我将其添加到此tempObjectContext
。
正如我在原始帖子中所述,添加新的a
或B
对象时,此C
会永久存在。但B
和C
无需与a
建立关系。因此,我也将B
和C
个对象添加到tempObjectContext
中。
现在,当我想要保存B
或C
个对象时,我会将其保存到[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];
那么,为什么我要这么做呢?简单:当我将所有A
,B
和C
放入同一个对象中,然后创建a
之后b
,我无法保存b
未保存a
(因为他们都在相同的背景下抵制)。使用单独的上下文解决了这个问题。