我尝试将UIManagedDocument上下文用于多个选项卡,以检索和存储数据库中的数据。但是,它只能在我的第一个标签上检索信息。第二个和第三个选项卡不显示数据,我无法使用它们将数据插入Core Data。我使用检索的上下文来设置一个通用的NSFetchController,但正如我所说,这只适用于第一个选项卡。我做错了什么?
- (NSManagedObjectContext *)managedObjectContext {
if (_document.managedObjectContext) {
return _document.managedObjectContext;
}
NSFileManager *fileManager = [NSFileManager defaultManager];
NSURL *documentsDirectory = [[fileManager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject]; // Default location to store the document
NSString *documentName = @"ModelDocument";
NSURL *url = [documentsDirectory URLByAppendingPathComponent:documentName];
self.document = [[UIManagedDocument alloc] initWithFileURL:url];
if ([fileManager fileExistsAtPath:[url path]]) { // If already exists, open the document
[self.document openWithCompletionHandler:^(BOOL success) {
if (success) {
[self announceContextReady];
} else {
NSLog(@"Problem with database!");
}
}];
} else {
[self.document saveToURL:url forSaveOperation:UIDocumentSaveForCreating completionHandler:^(BOOL success) { // Document doesnt exist, create it
if (success) {
[self announceContextReady];
} else {
NSLog(@"Problem with saving!");
}
}];
}
return _document.managedObjectContext;
}
获取控制器(无法在第二个或第三个选项卡上工作):
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
switch (type) {
case NSFetchedResultsChangeInsert: {
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
case NSFetchedResultsChangeDelete: {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
case NSFetchedResultsChangeUpdate: {
[self configureCell:(UITableViewCell *)[self.tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
}
case NSFetchedResultsChangeMove: {
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}
}
}
答案 0 :(得分:0)
第二个和第三个选项卡可能没有对托管对象上下文的引用(或者至少不是同一个上下文),因此不能对持久性存储执行任何操作。获取的结果控制器也是如此。
为了让所有三个选项卡显示来自同一持久存储的信息,它们都需要引用相同的托管对象上下文。一种方法是创建一个自定义选项卡栏控制器,它具有您根据需要设置的托管对象上下文。然后,三个选项卡视图控制器中的每一个都可以观察标签栏控制器的上下文,并在标签栏控制器的上下文更改时更新它们自己的上下文。这将允许所有三个选项卡指向相同的上下文,因此可以使用公共数据池。
如果每个选项卡显示与模型不同的实体,则每个选项卡都需要自己的获取结果控制器,以配置为拉出正确的实体。