0

我有一个从context1 中NSManagedObject获取的人 Scott 。NSManagedObjectContext我也从NSManagedObjectContextcontext2 中获取了相同的 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' 名称中。

4

3 回答 3

3

您可以通过NSManagedObjectID. 正如医生所说

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

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

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

另请参阅-existingObjectWithID:error: 和 –objectWithID: 有什么区别?和苹果文档。

让我知道您是否需要其他东西。

于 2013-10-25T17:08:34.883 回答
1

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

[context2 MR_observeContext:context1]

于 2013-10-25T22:18:22.187 回答
0

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

[context MR_saveToPersistentStoreAndWait];或者

[boundary1.managedObjectContext MR_saveToPersistentStoreAndWait];

CoreData 实体更新通知只会在您保存上下文时发布。您可以将上下文视为草稿本。如果您从 context1 对实体进行任何更改并且您不希望这些更改被持久化,您可以简单地丢弃上下文(将 context 设置为 nil)并且不会持久化任何内容。

于 2014-07-24T16:19:19.017 回答