从一个 NSManagedObjectContext 保存的更改不会反映在主 NSManagedObjectContext 上
我有一个在 appDelegate
中创建的主 NSManagedObjectContext
。
现在,我使用另一个 NSManagedObjectContext
来编辑/添加新对象,而不影响主 NSManagedObjectContext
,直到我保存它们。
当我保存第二个 NSManagedObjectContext 时,更改不会反映在主 NSManagedObjectContext 中,但如果我从模拟器中打开 .sqlite 数据库,更改已正确保存到.sqlite 数据库。我是否再次获取数据并不重要,或者即使我创建了第三个 NSManagedObjectContext
,我也看不到第二个 NSManagedObjectContext
中的这些更改,尽管事实上这些更改此时确实存在于磁盘上。
如果我退出并重新打开应用程序,所有更改都会在那里。
什么会导致主 NSManagedObjectContext 看不到持久存储中存在的新更改?
在此方法之前,我使用单个 NSManagedObjectContext
和 undoManager
,但我想将其更改为使用两个不同的 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 NSManagedObjectContext
s.
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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
如果您还没有这样做,我建议您阅读 Apple 文档 核心数据:变更管理。
您需要将通过第二个上下文保存的更改通知第一个上下文。保存上下文时,它会发布一个 NSManagedObjectContextDidSaveNotification。注册该通知。在处理程序方法中,将通过第二个上下文保存的更改合并到第一个上下文中。例如:
通知处理程序:
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:Notification handler: