#238: Migration code
This commit is contained in:
parent
01116aa515
commit
ff1a6eecea
15 changed files with 969 additions and 2 deletions
177
Photo/CoreDataTableViewController.m
Normal file
177
Photo/CoreDataTableViewController.m
Normal file
|
@ -0,0 +1,177 @@
|
|||
//
|
||||
// CoreDataTableViewController.m
|
||||
//
|
||||
// Created for Stanford CS193p Fall 2011.
|
||||
// Copyright 2011 Stanford University. All rights reserved.
|
||||
//
|
||||
|
||||
#import "CoreDataTableViewController.h"
|
||||
|
||||
@interface CoreDataTableViewController()
|
||||
@property (nonatomic) BOOL beganUpdates;
|
||||
@end
|
||||
|
||||
@implementation CoreDataTableViewController
|
||||
|
||||
#pragma mark - Properties
|
||||
|
||||
@synthesize fetchedResultsController = _fetchedResultsController;
|
||||
@synthesize suspendAutomaticTrackingOfChangesInManagedObjectContext = _suspendAutomaticTrackingOfChangesInManagedObjectContext;
|
||||
@synthesize debug = _debug;
|
||||
@synthesize beganUpdates = _beganUpdates;
|
||||
|
||||
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
|
||||
{
|
||||
return YES;
|
||||
}
|
||||
|
||||
#pragma mark - Fetching
|
||||
|
||||
- (void)performFetch
|
||||
{
|
||||
if (self.fetchedResultsController) {
|
||||
if (self.fetchedResultsController.fetchRequest.predicate) {
|
||||
if (self.debug) NSLog(@"[%@ %@] fetching %@ with predicate: %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName, self.fetchedResultsController.fetchRequest.predicate);
|
||||
} else {
|
||||
if (self.debug) NSLog(@"[%@ %@] fetching all %@ (i.e., no predicate)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), self.fetchedResultsController.fetchRequest.entityName);
|
||||
}
|
||||
NSError *error = nil;
|
||||
[self.fetchedResultsController performFetch:&error];
|
||||
if (error) NSLog(@"[%@ %@] %@ (%@)", NSStringFromClass([self class]), NSStringFromSelector(_cmd), [error localizedDescription], [error localizedFailureReason]);
|
||||
} else {
|
||||
if (self.debug) NSLog(@"[%@ %@] no NSFetchedResultsController (yet?)", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
|
||||
}
|
||||
[self.tableView reloadData];
|
||||
}
|
||||
|
||||
- (void)setFetchedResultsController:(NSFetchedResultsController *)newfrc
|
||||
{
|
||||
NSFetchedResultsController *oldfrc = _fetchedResultsController;
|
||||
if (newfrc != oldfrc) {
|
||||
_fetchedResultsController = newfrc;
|
||||
newfrc.delegate = self;
|
||||
if ((!self.title || [self.title isEqualToString:oldfrc.fetchRequest.entity.name]) && (!self.navigationController || !self.navigationItem.title)) {
|
||||
self.title = newfrc.fetchRequest.entity.name;
|
||||
}
|
||||
if (newfrc) {
|
||||
if (self.debug) NSLog(@"[%@ %@] %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), oldfrc ? @"updated" : @"set");
|
||||
[self performFetch];
|
||||
} else {
|
||||
if (self.debug) NSLog(@"[%@ %@] reset to nil", NSStringFromClass([self class]), NSStringFromSelector(_cmd));
|
||||
[self.tableView reloadData];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#pragma mark - UITableViewDataSource
|
||||
|
||||
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
|
||||
{
|
||||
return [[self.fetchedResultsController sections] count];
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
|
||||
{
|
||||
return [[[self.fetchedResultsController sections] objectAtIndex:section] numberOfObjects];
|
||||
}
|
||||
|
||||
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
|
||||
{
|
||||
return [[[self.fetchedResultsController sections] objectAtIndex:section] name];
|
||||
}
|
||||
|
||||
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
|
||||
{
|
||||
return [self.fetchedResultsController sectionForSectionIndexTitle:title atIndex:index];
|
||||
}
|
||||
|
||||
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
|
||||
{
|
||||
return [self.fetchedResultsController sectionIndexTitles];
|
||||
}
|
||||
|
||||
#pragma mark - NSFetchedResultsControllerDelegate
|
||||
|
||||
- (void)controllerWillChangeContent:(NSFetchedResultsController *)controller
|
||||
{
|
||||
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext) {
|
||||
[self.tableView beginUpdates];
|
||||
self.beganUpdates = YES;
|
||||
}
|
||||
}
|
||||
|
||||
- (void)controller:(NSFetchedResultsController *)controller
|
||||
didChangeSection:(id <NSFetchedResultsSectionInfo>)sectionInfo
|
||||
atIndex:(NSUInteger)sectionIndex
|
||||
forChangeType:(NSFetchedResultsChangeType)type
|
||||
{
|
||||
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
|
||||
{
|
||||
switch(type)
|
||||
{
|
||||
case NSFetchedResultsChangeInsert:
|
||||
[self.tableView insertSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
|
||||
break;
|
||||
|
||||
case NSFetchedResultsChangeDelete:
|
||||
[self.tableView deleteSections:[NSIndexSet indexSetWithIndex:sectionIndex] withRowAnimation:UITableViewRowAnimationFade];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
- (void)controller:(NSFetchedResultsController *)controller
|
||||
didChangeObject:(id)anObject
|
||||
atIndexPath:(NSIndexPath *)indexPath
|
||||
forChangeType:(NSFetchedResultsChangeType)type
|
||||
newIndexPath:(NSIndexPath *)newIndexPath
|
||||
{
|
||||
if (!self.suspendAutomaticTrackingOfChangesInManagedObjectContext)
|
||||
{
|
||||
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.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
|
||||
break;
|
||||
|
||||
case NSFetchedResultsChangeMove:
|
||||
[self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
|
||||
[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
- (void)controllerDidChangeContent:(NSFetchedResultsController *)controller
|
||||
{
|
||||
if (self.beganUpdates) {
|
||||
self.beganUpdates = NO;
|
||||
[self.tableView endUpdates];
|
||||
}
|
||||
}
|
||||
|
||||
- (void)endSuspensionOfUpdatesDueToContextChanges
|
||||
{
|
||||
_suspendAutomaticTrackingOfChangesInManagedObjectContext = NO;
|
||||
}
|
||||
|
||||
- (void)setSuspendAutomaticTrackingOfChangesInManagedObjectContext:(BOOL)suspend
|
||||
{
|
||||
if (suspend) {
|
||||
_suspendAutomaticTrackingOfChangesInManagedObjectContext = YES;
|
||||
} else {
|
||||
[self performSelector:@selector(endSuspensionOfUpdatesDueToContextChanges) withObject:0 afterDelay:0];
|
||||
}
|
||||
}
|
||||
|
||||
@end
|
||||
|
Loading…
Add table
Add a link
Reference in a new issue