将托管对象从私有上下文传递到主上下文:它会丢失其相关对象

时间:2015-10-28 10:22:24

标签: ios core-data relationship nsmanagedobject nsmanagedobjectcontext

我在私有上下文中有NSManagedObject我已经关联到私有队列。此NSManagedObject与许多其他NSManagedObject有关系。我想将此前NSManagedObject及其所有“嵌套”相关对象传递给我的主上下文,而不保存私有上下文,所以我试图这样做:

__block NSManagedObjectID *privateObjectID = nil;

[privateContext performBlockAndWait: ^{
   MyEntity *privateMyEntity = [self createMyEntityInContext:privateContext];
   privateObjectID = [privateMyEntity valueForKeyPath:@"objectID"];
}];

if (privateObjectID != nil) {
   self.currentMyEntity = [mainContext objectWithID:privateObjectID];
}

但我发现self.currentMyEntity已丢失其相关对象(其NSSet为空)。

但是,如果我在传递托管对象之前保存私有上下文,那么在self.currentMyEntity中我也会得到相关对象:

__block NSManagedObjectID *privateObjectID = nil;

[privateContext performBlockAndWait: ^{
   MyEntity *privateMyEntity = [self createMyEntityInContext:privateContext];
   [self saveContext:privateContext];
   privateObjectID = [privateMyEntity valueForKeyPath:@"objectID"];
}];

if (privateObjectID != nil) {
   self.currentMyEntity = [mainContext objectWithID:privateObjectID];
}

为什么呢?我不想将对象保存在私有上下文中......

提前致谢

1 个答案:

答案 0 :(得分:2)

我认为你应该阅读Core Data Programming Guide,然后你应该重新评估你想要完成的事情。

首先,如果您不将数据保存在任何地方,您如何期望单独的上下文获取有关该对象的任何内容?就该上下文而言,该对象甚至不存在?他们有什么共同点?持久性商店协调员?持久的商店?如果他们共同拥有的实体没有数据,那么不同的上下文应该如何交换数据呢?

其次,您无法在上下文之间传递临时对象ID,并希望使用它们。

第三,objectWithID总是返回一个对象,即使该对象不存在,所以你应该只在某些情况下使用它。

如果您不想在私人环境中保存对象,那么您想用它做什么?

如果您只想将其传递给其他上下文,则可以将私有上下文创建为其他上下文的子上下文。从私有上下文保存时,它只会将数据保存到该上下文中,而不保存到数据库中。