【问题标题】:Managed object not deleted properly in my core database在我的核心数据库中未正确删除托管对象
【发布时间】:2013-08-14 15:57:17
【问题描述】:

我正在尝试从我的Entity Reservation 中删除一些对象。我就是这样做的。

NSManagedObjectContext *context = reservation.managedObjectContext;
[context deleteObject:reservation];
NSError *error = nil;
if (![context save:&error]) {
    NSLog(@"Error is %@",error);
}

之后我删除了我的对象,我再次获取整个entity。我可以看到该对象已从我的entity 中删除。但是当我重新启动我的应用程序时,我在上一个会话中删除的所有对象都重新存储在我的 entity 中。

我正在使用restkit 来存储我从网络服务返回的对象。此外,当我删除对象时,我也在我的数据库中删除它。

当我重新启动我的应用程序并查看我的日志时,我发现我没有从我在上一个会话中删除的 web 服务中取回对象,所以没关系。唯一的问题是它们以某种方式存储在我的core database 中。

【问题讨论】:

  • 您的删除是否发生在后台线程中?我认为删除对象时不会更新持久存储,如果这发生在后台线程上,请确保将更改与 mergeChangesFromContextDidSaveNotification 合并:
  • 合并更改是什么意思?

标签: iphone ios objective-c core-data restkit


【解决方案1】:

我不完全确定 reskit 如何处理线程上的保存/删除,但基本上当您在注册通知的主线程上设置 NSManagedObjectContext 时。

-(NSManagedObjectContext *)aContext
{
   if (!_aContext) {
       _aContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
       [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(mergeChanges:) name:NSManagedObjectContextDidSaveNotification object:nil];
   }
   return _aContext;
}

如果在后台线程上发生上下文更改,则会发送通知。

-(void)mergeChanges:(NSNotification *)aNotification
{
 // Merge the changes from the notification
 // on the main thread as this is the main
 // context for our application.
 dispatch_async(dispatch_get_main_queue(), ^{

    [self.aContext mergeChangesFromContextDidSaveNotification:aNotification];
 });
}

【讨论】:

猜你喜欢
  • 2023-04-08
  • 2023-04-02
  • 1970-01-01
  • 2014-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 1970-01-01
相关资源
最近更新 更多