我从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
的名称中。
答案 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),并且不会保留任何内容。