Core Data, Networking Android




CS185c

Chris Pollett

Oct. 6, 2010

Outline

Core Data on iPhone

Core Data Demo

Model Files

Table View Controller

PersonTableController.m

#import "PersonTableController.h"


@implementation PersonTableController

@synthesize managedObjectContext, personArray;  


#pragma mark -
#pragma mark View lifecycle

- (void)viewDidLoad {   
   
	[super viewDidLoad];  
	self.title = @"People";  
	UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self 
																			   action:@selector(addPerson:)];  
	self.navigationItem.rightBarButtonItem = addButton;  
	[addButton release];  
	[self fetchRecords];   
   
} 

 - (void)addPerson:(id)sender {   
   
     Person *person = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];  
     [person setID: @"123456789"];
	 [person setEmail: @"youhoo@wink.com"];

     Person *person2 = (Person *)[NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:managedObjectContext];  
     [person2 setID: @"012345678"];
	 [person2 setEmail: @"iseeu@wink.com"];
	NSError *error;  
   
     if(![managedObjectContext save:&error]){  
   
         //This is a serious error saying the record  
         //could not be saved. Advise the user to  
         //try again or restart the application.   
   
     }  
   
	 [personArray insertObject:person atIndex:0];  
     [personArray insertObject:person2 atIndex:1]; 
	 
     [self.tableView reloadData];  
   
}  
   
- (void)fetchRecords {   
   
     // Define our table/entity to use  
     NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:managedObjectContext];   
   
     // Setup the fetch request  
     NSFetchRequest *request = [[NSFetchRequest alloc] init];  
     [request setEntity:entity];   
   
     // Define how we will sort the records  
     NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"ID" ascending:NO];  
     NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];  
     [request setSortDescriptors:sortDescriptors];  
     [sortDescriptor release];   
   
     // Fetch the records and handle an error  
     NSError *error;  
     NSMutableArray *mutableFetchResults = [[managedObjectContext executeFetchRequest:request error:&error] mutableCopy];   
   
     if (!mutableFetchResults) {  
         // Handle the error.  
         // This is a serious error and should advise the user to restart the application  
     }   
   
     // Save our fetched data to an array  
     [self setPersonArray: mutableFetchResults];  
     [mutableFetchResults release];  
     [request release];  
 }   
   



#pragma mark -
#pragma mark Table view data source

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {  
	return 1;  
}   
   
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {  
	return [personArray count];  
}   

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {   
   
 static NSString *CellIdentifier = @"Cell";  
 
   
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];   
   
 if (cell == nil) {  
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];  
 }   
   
 Person  *person = [personArray objectAtIndex: [indexPath row]];  
 Person *previousPerson = nil;   
   
 if ([personArray count] > ([indexPath row] + 1)) {  
     previousPerson = [personArray objectAtIndex: ([indexPath row] + 1)];  
 }  
     

 [cell.textLabel setText: [person ID]];   
   
 if (previousPerson) {  
     [cell.detailTextLabel setText: [NSString stringWithFormat:@"2nd %@", [person email]]];  
 } else {  
     [cell.detailTextLabel setText: [person email]];  
 }   
   
 return cell;   
   
} 


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
	/*
	 <#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
     // ...
     // Pass the selected object to the new view controller.
	 [self.navigationController pushViewController:detailViewController animated:YES];
	 [detailViewController release];
	 */
}


#pragma mark -
#pragma mark Memory management

- (void)didReceiveMemoryWarning {
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    
    // Relinquish ownership any cached data, images, etc that aren't in use.
}

- (void)viewDidUnload {
    // Relinquish ownership of anything that can be recreated in viewDidLoad or on demand.
    // For example: self.myOutlet = nil;
}


- (void)dealloc {  
	[managedObjectContext release];  
	[personArray release];  
	[super dealloc];  
}   

@end   

App Delegate code

Overview of Networking

Clients and Servers

Checking Network Status

Creating a Server Socket

Communicating with a Server