在另一个上下文中更新Core Data实体

时间:2013-10-25 15:20:43

标签: ios objective-c core-data

我从NSManagedObject context1获取了NSManagedObjectContext人Scott。我也从NSManagedObjectContext context2获取了相同的Scott。

我知道如果我从同一个上下文中获取它们,如果一个更新,另一个也会更新,但我当前的结构不会轻易让我传递相同的上下文。我想知道是否还有另一种方式,就像KVO一样。

当我在context1中对Person Scott进行更改时,我可以在context2中更新Person Scott吗?

编辑:

尝试测试:

NSError *error = nil;

NSManagedObjectContext *context = [NSManagedObjectContext MR_context];
NSManagedObjectContext *context2 = [NSManagedObjectContext MR_context];

Boundary *boundary1 = [Boundary MR_findFirstInContext:context];
DLog(@"boundary1.name: %@", boundary1.name);
DLog(@"boundary1.managedObjectContext: %@", boundary1.managedObjectContext);

Boundary *boundary2 = (Boundary *)[context2 existingObjectWithID:boundary1.objectID error:&error];
DLog(@"boundary2.name: %@", boundary2.name);
DLog(@"boundary2.managedObjectContext: %@", boundary2.managedObjectContext);

boundary1.name = @"new name";

// Added this, does not change results
[context2 MR_observeContext:context];

DLog(@"boundary1.name: %@", boundary1.name);
DLog(@"boundary1.managedObjectContext: %@", boundary1.managedObjectContext);

DLog(@"boundary2.name: %@", boundary2.name);
DLog(@"boundary2.managedObjectContext: %@", boundary2.managedObjectContext);

结果:

DEBUG | -[LoginViewController viewDidLoad] | boundary1.name: 997677
DEBUG | -[LoginViewController viewDidLoad] | boundary1.managedObjectContext: <NSManagedObjectContext: 0x1cdc6b20>
DEBUG | -[LoginViewController viewDidLoad] | boundary2.name: 997677
DEBUG | -[LoginViewController viewDidLoad] | boundary2.managedObjectContext: <NSManagedObjectContext: 0x1cdd7930>
DEBUG | -[LoginViewController viewDidLoad] | boundary1.name: new name
DEBUG | -[LoginViewController viewDidLoad] | boundary1.managedObjectContext: <NSManagedObjectContext: 0x1cdc6b20>
DEBUG | -[LoginViewController viewDidLoad] | boundary2.name: 997677
DEBUG | -[LoginViewController viewDidLoad] | boundary2.managedObjectContext: <NSManagedObjectContext: 0x1cdd7930>

boundary1名称的更改不会保留在boundary2的名称中。

3 个答案:

答案 0 :(得分:3)

您可以通过NSManagedObjectID将对象从上下文传递到另一个对象。正如医生说的那样

  

托管对象ID唯一地标识同一托管对象   在单个应用程序中的托管对象上下文之间   多个应用程序(如在分布式系统中)。标识符包含   准确描述持久性对象所需的信息   store(就像数据库中的主键),虽然详细   信息不会暴露。

基于此,如果您通过id从上下文传递对象,那么在另一个中您可以检索,修改和保存它。前一种情况会看到这些变化。

在上下文中,您可以使用existingObjectWithID:error:来返回具有指定ID的对象。

另请参阅What's the difference between -existingObjectWithID:error: and –objectWithID:?和Apple doc。

如果您需要别的东西,请告诉我。

答案 1 :(得分:1)

您需要将更改从一个上下文合并到另一个上下文。 由于看起来你正在使用MagicalRecord,你可以轻松地使用:

[context2 MR_observeContext:context1]

答案 2 :(得分:0)

您需要保存更改,以便通过更改通知其他上下文

[context MR_saveToPersistentStoreAndWait];

[boundary1.managedObjectContext MR_saveToPersistentStoreAndWait];

仅在保存上下文时才会发布CoreData实体更新通知。您可以将上下文视为临时工具。如果您从context1对实体进行任何更改,并且您不希望保留这些更改,则可以简单地丢弃上下文(将上下文设置为nil),并且不会保留任何内容。