在另一个上下文中更新核心数据实体



我有一个NSManagedObject人斯科特从上下文1 NSManagedObjectContext获取。我也从上下文中获取了相同的斯科特2 NSManagedObjectContext

我知道如果我从相同的上下文中获取它们,如果一个被更新,另一个也会被更新,但我当前的结构不容易允许我传递相同的上下文。我想知道是否有另一种方式,类似于 KVO 的东西。

当我在上下文

1 中更改人员斯科特时,是否可以更新上下文 2 中的人员斯科特?

编辑:

尝试测试:

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 的名称中。

您可以通过 NSManagedObjectID 将对象从一个上下文传递到另一个上下文。正如文档所说

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

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

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

另请参阅 -existingObjectWithID:error: 和 –objectWithID:? 和 Apple doc 之间的区别。

如果您需要其他东西,请告诉我。

您需要将

更改从一个上下文合并到另一个上下文。由于看起来您正在使用MagicalRecord,因此您可以使用以下方法轻松完成:

[context2 MR_observeContext:context1]

您需要

保存更改,以便更改通知其他上下文

[context MR_saveToPersistentStoreAndWait];

[boundary1.managedObjectContext MR_saveToPersistentStoreAndWait];

仅当您保存上下文时,才会发布 CoreData 实体更新的通知。您可以将上下文视为草稿簿。如果从 context1 对实体进行任何更改,并且不希望保留这些更改,则只需放弃上下文(将上下文设置为 nil),则不会保留任何内容。

最新更新