从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上

发布于 2024-11-10 06:30:01 字数 1409 浏览 0 评论 0原文

我有一个在 appDelegate 中创建的主 NSManagedObjectContext

现在,我使用另一个 NSManagedObjectContext 来编辑/添加新对象,而不影响主 NSManagedObjectContext,直到我保存它们。

当我保存第二个 NSManagedObjectContext 时,更改不会反映在主 NSManagedObjectContext 中,但如果我从模拟器中打开 .sqlite 数据库,更改已正确保存到.sqlite 数据库。我是否再次获取数据并不重要,或者即使我创建了第三个 NSManagedObjectContext,我也看不到第二个 NSManagedObjectContext 中的这些更改,尽管事实上这些更改此时确实存在于磁盘上。

如果我退出并重新打开应用程序,所有更改都会在那里。

什么会导致主 NSManagedObjectContext 看不到持久存储中存在的新更改?

在此方法之前,我使用单个 NSManagedObjectContextundoManager,但我想将其更改为使用两个不同的 NSManagedObjectContext

第二个 NSManagedObjectContext 保存:

    NSError* error = nil;

    if ([managedObjectContext hasChanges]) {
        NSLog(@"This new object has changes");
    }

    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

I have a main NSManagedObjectContext that's created in the appDelegate.

Now, I'm using another NSManagedObjectContext for editing/adding new objects without affecting the main NSManagedObjectContext, until I save them.

When I save the second NSManagedObjectContext, the changes are not reflected in the main NSManagedObjectContext, yet if I open the .sqlite database from simulator, the changes have been saved correctly into the .sqlite database. It doesn't matter if I fetch the data again, or even if I create a third NSManagedObjectContext, I cannot see those changes from the second NSManagedObjectContext, despite the fact those changes do actually exist on disk at this point.

If I quit and re-open the app, all changes are there.

What can cause the main NSManagedObjectContext to not see the new changes present in the persistent store?

Before this approach, I was using a single NSManagedObjectContext and undoManager, but I wanted to change it to use two different NSManagedObjectContexts.

The second NSManagedObjectContext save:

    NSError* error = nil;

    if ([managedObjectContext hasChanges]) {
        NSLog(@"This new object has changes");
    }

    if (![managedObjectContext save:&error]) {
        NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
        NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
        if(detailedErrors != nil && [detailedErrors count] > 0) {
            for(NSError* detailedError in detailedErrors) {
                NSLog(@"  DetailedError: %@", [detailedError userInfo]);
            }
        }
        else {
            NSLog(@"  %@", [error userInfo]);
        }
    }

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

离不开的别离 2024-11-17 06:30:01

如果您还没有这样做,我建议您阅读 Apple 文档 核心数据:变更管理。

您需要将通过第二个上下文保存的更改通知第一个上下文。保存上下文时,它会发布一个 NSManagedObjectContextDidSaveNotification。注册该通知。在处理程序方法中,将通过第二个上下文保存的更改合并到第一个上下文中。例如:

// second managed object context save

// register for the notification
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
       selector:@selector(handleDidSaveNotification:)
           name:NSManagedObjectContextDidSaveNotification 
         object:secondManagedObjectContext];

// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
    // ...
}

// unregister from notification
[[NSNotificationCenter defaultCenter] 
    removeObserver:self 
              name:NSManagedObjectContextDidSaveNotification 
            object:secondManagedObjectContext];

通知处理程序:

- (void)handleDidSaveNotification:(NSNotification *)note {
    [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}

If you haven't already done so, I suggest reading the Apple documentation on Core Data : Change Management.

You need to notify the first context of the changes that were saved through the second context. When saving a context, it posts a NSManagedObjectContextDidSaveNotification. Register for that notification. In the handler method, merge into the first context the changes saved through the second context. For example:

// second managed object context save

// register for the notification
[[NSNotificationCenter defaultCenter] 
    addObserver:self 
       selector:@selector(handleDidSaveNotification:)
           name:NSManagedObjectContextDidSaveNotification 
         object:secondManagedObjectContext];

// rest of the code ommitted for clarity
if (![secondManagedObjectContext save:&error]) {
    // ...
}

// unregister from notification
[[NSNotificationCenter defaultCenter] 
    removeObserver:self 
              name:NSManagedObjectContextDidSaveNotification 
            object:secondManagedObjectContext];

Notification handler:

- (void)handleDidSaveNotification:(NSNotification *)note {
    [firstManagedObjectContext mergeChangesFromContextDidSaveNotification:note];
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文