2013-03-07 78 views
0

UPDATED版本core data update in background核心数据在后台

与链接Grand Central Dispatch (GCD) with CoreData的帮助下创建一个背景managedObjectContext但是从核心数据读取时,我得到一个错误

-(void) startTimerThread 
{ 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Add code here to do background processing 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] init]; 
     self.backgroundManagedObjectContext = context; 
     [self.backgroundManagedObjectContext setPersistentStoreCoordinator:self.managedObjectContext.persistentStoreCoordinator]; 
     self.managedObjectContext = self.backgroundManagedObjectContext; 
     [self getDataFromFile]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 

     [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil]; 
     [context release]; 
     self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 
    }); 
}); 

}

,并在我的getDataFromFile我得到的错误,当我尝试获取从managedObjectContext

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
[request setPredicate:[NSPredicate predicateWithFormat:@"date == max(date)"]]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:self.managedObjectContext]; 

了同样的错误:

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name LogDetails 

谁能告诉我为什么我得到这个错误。以前我试图创建一个childObjectObjectContext,它给出了相同的错误。

在此先感谢。

+0

不要发布一个新问题,请编辑你想要的任何更新的原始问题。 – Caleb 2013-03-07 18:20:13

+0

好的。对不起。谢谢 – aparna 2013-03-08 06:57:06

回答

1

我不太清楚为什么要创建一个上下文并将其设置为self.backgroundManagedObjectContext,然后将其设置为self.managedObjectContext。我会建议让你的getDataFromFile方法在一个上下文中,以便你可以从任何线程调用它。

你将不得不

- (void)getDataFromFileOnContext:(NSManagedObjectContext *)context 
{ 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    [request setPredicate:[NSPredicate predicateWithFormat:@"date == max(date)"]]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"LogDetails" inManagedObjectContext:context]; 
} 

然后你就可以做到这一点

-(void) startTimerThread 
{ 
    self.managedObjectContext = [(AppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext]; 

    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     // Add code here to do background processing 
     NSManagedObjectContext *context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; 
     [context setParentContext:self.managedObjectContext]; 
     [self getDataFromFileOnContext:context]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 
     // Add code here to update the UI/send notifications based on the 
     // results of the background processing 

    [[NSNotificationCenter defaultCenter] postNotificationName:@"ReloadAppDelegateTable" object:nil];   
    }); 
}); 

让我知道如果你需要一些更多的帮助。