未保存核心数据数据
我目前正在开发一个使用核心数据来存储数据的应用程序。应用程序通过下载和解析一个巨大的XML文件(大约40000个条目)将其内容与Web服务器同步。该应用程序允许用户搜索数据并对其进行修改(CRUD)。取回操作太重,这就是为什么我决定使用以下模式:未保存核心数据数据
“主线程的一个托管对象上下文(NSMainQueueConcurrencyType),以刷新用户界面。大量读取和更新通过多个后台管理对象上下文(NSPrivateQueueConcurrencyType)。不使用儿童上下文“。我试图更新或删除一个“用户”(对象“用户”是从填充数组中获得)在后台上下文中的一些对象(让我们说数组“最后我保存了上下文。
我正在听NSManagedObjectContextDidSaveNotification并将任何修改与我的主线程管理对象上下文合并。
除了当我重新启动我的应用程序,我意识到没有任何修改已保存,每件事情都可以正常工作。
下面是一些代码解释所使用的图案
-
主管理对象上下文:
-(NSManagedObjectContext *)mainManagedObjectContext { if (_mainManagedObjectContext != nil) { return _mainManagedObjectContext; } NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; _mainManagedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType]; [_mainManagedObjectContext setPersistentStoreCoordinator:coordinator]; return _mainManagedObjectContext;
}
-
背景管理对象上下文:
-(NSManagedObjectContext *)newManagedObjectContext { NSManagedObjectContext *newContext; NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator]; newContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType]; [newContext performBlockAndWait:^{ [newContext setPersistentStoreCoordinator:coordinator]; }]; return newContext;
}
-
更新记录:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ FootBallCoach *coach = [_coaches objectAtIndex:indexPath.row]; coach.firstName = [NSString stringWithFormat:@"Coach %i",indexPath.row]; NSManagedObjectContext *context = [[SDCoreDataController sharedInstance] newManagedObjectContext]; [context performBlock:^{ NSError *error; [context save:&error]; if (error) { NSLog(@"ERROR SAVING : %@",error.localizedDescription); } dispatch_async(dispatch_get_main_queue(), ^{ [self refreshCoaches:nil]; }); }];
}
我失去了什么东西?我应该在保存后台上下文后保存主要的托管对象上下文吗?
如果您的上下文使用持久性存储协调器进行配置,则保存应将数据写入存储。如果您的上下文使用另一个上下文作为父级配置,则保存会将数据推送给父级。只有当最后一个父配置文件被配置为持久性存储协调器时,才会写入商店。
- 检查您的后台上下文是否配置了持久存储协调器。
- 检查返回值和
-save:
的可能错误。 - 确保您通过
-performBlock...:
方法处理您的背景环境。
UPDATE
每次你打电话给你-newManagedObjectContext
方法时,都会创建一个新的上下文。这个上下文对你正在更新的FootBallCoach对象一无所知。您需要保存FootBallCoach对象所属的上下文。
不要忘了,每个对象都属于一个且只有一个方面。
另外,还要确保你持有的强引用其对象你使用的上下文。
我编辑我的问题,并增加了一些示例代码。正如你所看到的,没有父子上下文模式,保存错误为零。 – rokridi
您每次都在创建新的上下文。更新了答案。 – eofster
FootBallCoach对象在主要上下文中获取。那么你是说我应该保存主要的上下文吗? – rokridi