Top Banner
Core Data iz iPhone vidika Matej Bukovinski www.bukovinski.com sreda, 16. december 2009
29

Core Data

Nov 18, 2014

Download

Education

bukovinski

Core Data za iPhone. Prezentacija iz MobDev Slovenia (http://www.meetup.com/mobdev/).
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Core Data

Core Dataiz iPhone vidika

Matej Bukovinskiwww.bukovinski.com

sreda, 16. december 2009

Page 2: Core Data

Agenda

• Malo teorije (z kodo)

• Malo prakse (preprost Xcode demo)

• Q&A

sreda, 16. december 2009

Page 3: Core Data

Core Data1. del, Teorija

sreda, 16. december 2009

Page 4: Core Data

Core data

• Mehanizmi za upravljaje z objektnim grafom in življenjskim ciklom objektov

• Zagotavlja trajnost podatkov (presistence)

• Enostavnejši način za ravnanje z MVC Model objekti

• Framework (CoreData.framework)

• Sestavni del Cocoa API-ja od Mac OS X 10.4

• Sestavni del Cocoa-touch od iPhone OS 3.0

sreda, 16. december 2009

Page 5: Core Data

Prednosti

• Model objekte preprosto narišemo (z relacijami!) v entitetnem modelu (včasih popolnoma brez kode)

• Znebimo se ogromno kode za zagotavljanje trajnosti podatkov (nalaganje, shranjevanje,...)

• Učinkovitost (hitrejše in pogosto manj pomnilniško zahtevno kot direktni SQL pristop)

• Priročne metode za poizvedovanje in optimizacijo

• Faulting (povezani objekt se po potrebi samodejno naloži)

• Undo manager

sreda, 16. december 2009

Page 6: Core Data

Slabosti

• Nekateri (Aaron) imajo rajši popolni nadzor nad tem kaj se dogaja z objekti v ozadju

sreda, 16. december 2009

Page 7: Core Data

Core Data sklad

NSPresistentStore

NSPresistentStoreCoordinator

NSManagedObjectContext

Entitetni model

Podatkovna shramba (npr. SQLite)

NSManagedObjectNSManagedObject

NSManagedObjectNSManagedObject

sreda, 16. december 2009

Page 8: Core Data

Core Data sklad

NSPresistentStore

NSPresistentStoreCoordinator

NSManagedObjectContext

Entitetni model

Podatkovna shramba (SQL, ...)

NSManagedObjectNSManagedObject

NSManagedObjectNSManagedObject

sreda, 16. december 2009

Page 9: Core Data

Core Data, uporaba v praksi

NSManagedObjectContext

Entitetni model

NSManagedObjectNSManagedObject

NSManagedObjectNSManagedObject

1 2

• Narišemo (ali spišemo) entitetni model, ki predstavlja naše poslovne objekte

• Tu določimo entitete, razmerja med njimi entitetami, atibute, omejitve...

• Po potrebi generiramo izvorno kodo v kateri lahko dodajamo dodatno logiko modelnim objektov

• Nad NSManagedObjectContext izvajamo splošne operacije (shranjevanje, nalaganje, dodajanje modelnih objektov)

• Poizvedbe oblikujemo z NSFechRequest (podobno kot SQL)

• Entitete so predstavljene z objekti, ki dedujejo od NSManagedObject, z njimi ravnamo kot z običajnimi Objective-C objekti

NSFetchRequest

+

sreda, 16. december 2009

Page 10: Core Data

Inicializacija

1. Naložimo entitetni model (NSManagedObjectModel)

2. Ustvarimo koordinatorja (NSPresistentStore-Coordinator) in ga povežemo z modelom

3. Dodamo shrambo (NSPresistentStore)

4. Ustvarimo kontekst (NSManagedObjectContext) in ga povežemo s koordinatorjem

sreda, 16. december 2009

Page 11: Core Data

Inicializacija

1. Naložimo entitetni model (NSManagedObjectModel)

2. Ustvarimo koordinatorja (NSPresistentStore-Coordinator) in ga povežemo z modelom

3. Dodamo shrambo (NSPresistentStore)

4. Ustvarimo kontekst (NSManagedObjectContext) in ga povežemo s koordinatorjem

Če izberemo pravi Xcode template je to za nas že poskrbljeno!

sreda, 16. december 2009

Page 12: Core Data

Nalaganje iz shrambe

// Ustvarimo fetch request (poizvedba)NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];// Povemo katera entiteta nas zanimaNSEntityDescription *entity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:self.managedObjectContext];[fetchRequest setEntity:entity];// Povemo kako želimo sortirati (opcijsko)NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES] autorelease];NSArray *sortDescriptors = [[NSArray arraytWithObjects:sortDescriptor, nil];[fetchRequest setSortDescriptors:sortDescriptors];// Naredimo poizvedbo in s tem ustvarimo naše objekteNSError *error;NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error];

sreda, 16. december 2009

Page 13: Core Data

Nalaganje iz shrambe

// Ustvarimo fetch request (poizvedba)NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];// Povemo katera entiteta nas zanimaNSEntityDescription *entity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:self.managedObjectContext];[fetchRequest setEntity:entity];// Povemo kako želimo sortirati (opcijsko)NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES] autorelease];NSArray *sortDescriptors = [[NSArray arraytWithObjects:sortDescriptor, nil];[fetchRequest setSortDescriptors:sortDescriptors];// Naredimo poizvedbo in s tem ustvarimo naše objekteNSError *error;NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error];

sreda, 16. december 2009

Page 14: Core Data

Nalaganje iz shrambe

// Ustvarimo fetch request (poizvedba)NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];// Povemo katera entiteta nas zanimaNSEntityDescription *entity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:self.managedObjectContext];[fetchRequest setEntity:entity];// Povemo kako želimo sortirati (opcijsko)NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES] autorelease];NSArray *sortDescriptors = [[NSArray arraytWithObjects:sortDescriptor, nil];[fetchRequest setSortDescriptors:sortDescriptors];// Naredimo poizvedbo in s tem ustvarimo naše objekteNSError *error;NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error];

sreda, 16. december 2009

Page 15: Core Data

Nalaganje iz shrambe

// Ustvarimo fetch request (poizvedba)NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease];// Povemo katera entiteta nas zanimaNSEntityDescription *entity = [NSEntityDescription entityForName:@"Song" inManagedObjectContext:self.managedObjectContext];[fetchRequest setEntity:entity];// Povemo kako želimo sortirati (opcijsko)NSSortDescriptor *sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"title" ascending:YES] autorelease];NSArray *sortDescriptors = [[NSArray arraytWithObjects:sortDescriptor, nil];[fetchRequest setSortDescriptors:sortDescriptors];// Naredimo poizvedbo in s tem ustvarimo naše objekteNSError *error;NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error];

sreda, 16. december 2009

Page 16: Core Data

Shranjevanje sprememb

NSError *error;// Če ni sprememb ni potrebno shranjevatiif ([managedObjectContext hasChanges]) {$ // Shranjevanje vseh sprememb - 1 vrstica kode!$ if (![managedObjectContext save:&error]) {$ $ // Poskrbi za napako$ }}

sreda, 16. december 2009

Page 17: Core Data

Shranjevanje sprememb

NSError *error;// Če ni sprememb ni potrebno shranjevatiif ([managedObjectContext hasChanges]) {$ // Shranjevanje vseh sprememb - 1 vrstica kode!$ if (![managedObjectContext save:&error]) {$ $ // Poskrbi za napako$ }}

sreda, 16. december 2009

Page 18: Core Data

Dodajanje novih objektov

// Ponavadi uporabljamo NSEntityDescription za ustvarjanje novih entitetSong *newSong = [NSEntityDescription$ $ $ $ $ insertNewObjectForEntityForName:@"Song"$ $ $ $ $ inManagedObjectContext:self.managedObjectContext];// Sedaj imamo Objective-C objekt, ki je umeščen v kontekst // Z njim ravnamo kot z vsemi drugimi objektinewSong.title = @"Yellow Submarine";

sreda, 16. december 2009

Page 19: Core Data

Dodajanje novih objektov

// Ponavadi uporabljamo NSEntityDescription za ustvarjanje novih entitetSong *newSong = [NSEntityDescription$ $ $ $ $ insertNewObjectForEntityForName:@"Song"$ $ $ $ $ inManagedObjectContext:self.managedObjectContext];// Sedaj imamo Objective-C objekt, ki je umeščen v kontekst // Z njim ravnamo kot z vsemi drugimi objektinewSong.title = @"Yellow Submarine";

sreda, 16. december 2009

Page 20: Core Data

Brisanje objektov

// Samo podamo konkretno “Song” instanco[self.managedObjectContext deleteObject:song];

sreda, 16. december 2009

Page 21: Core Data

NSFetchedResultsController

• Poenostavlja delo z UITableView pri uporabi Core Data

• Podamo NSFetchRequest, način sortiranja in grupiranja

• V UITableViewDataSource metodah kličemo metode na NSFetchedResultsContoller-ju in dobimo potrebne podatke za populacijo tabele

• Učinkovito (nalaganje v skupinah, sprostitev nevidnih objektov, uporaba predpomnjenja)

sreda, 16. december 2009

Page 22: Core Data

NSFetchedResultsController inicializacija// Pred tem ustrezno pripravimo fetchRequestself.fetchController = [[[NSFetchedResultsController alloc]$ $ $ $ $ $ initWithFetchRequest:fetchRequest$ $ $ $ $ $ managedObjectContext:self.managedObjectContext$ $ $ $ $ $ sectionNameKeyPath:@"artist"$ $ $ $ $ $ cacheName:@"songsCache"] autorelease];

NSError *error;BOOL success = [self.fetchController performFetch:&error];

if (!success) {$ // Napaka..}

sreda, 16. december 2009

Page 23: Core Data

NSFetchedResultsController inicializacija// Pred tem ustrezno pripravimo fetchRequestself.fetchController = [[[NSFetchedResultsController alloc]$ $ $ $ $ $ initWithFetchRequest:fetchRequest$ $ $ $ $ $ managedObjectContext:self.managedObjectContext$ $ $ $ $ $ sectionNameKeyPath:@"artist"$ $ $ $ $ $ cacheName:@"songsCache"] autorelease];

NSError *error;BOOL success = [self.fetchController performFetch:&error];

if (!success) {$ // Napaka..}

sreda, 16. december 2009

Page 24: Core Data

NSFetchedResultsController uporaba (1 od 2)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {$ // Hrošč pri 3.0, glej NSFetchedResultsController dokumentacijo, 3.1 OK$ return [[self.fetchController sections] count];}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {$ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section];$ return [sectionInfo numberOfObjects];}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {$ $ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section]; return [sectionInfo name];}

sreda, 16. december 2009

Page 25: Core Data

NSFetchedResultsController uporaba (1 od 2)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {$ // Hrošč pri 3.0, glej NSFetchedResultsController dokumentacijo, 3.1 OK$ return [[self.fetchController sections] count];}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {$ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section];$ return [sectionInfo numberOfObjects];}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {$ $ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section]; return [sectionInfo name];}

sreda, 16. december 2009

Page 26: Core Data

NSFetchedResultsController uporaba (1 od 2)- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {$ // Hrošč pri 3.0, glej NSFetchedResultsController dokumentacijo, 3.1 OK$ return [[self.fetchController sections] count];}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {$ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section];$ return [sectionInfo numberOfObjects];}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {$ $ id <NSFetchedResultsSectionInfo> sectionInfo = $ $ $ [[fetchController sections] objectAtIndex:section]; return [sectionInfo name];}

sreda, 16. december 2009

Page 27: Core Data

NSFetchedResultsController uporaba (2 od 2)- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

$ static NSString *CellIdentifier = @"SongCell";$ UITableViewCell *cell = [tableView $ $ $ dequeueReusableCellWithIdentifier:CellIdentifier];

$ if (cell == nil) {$ $ cell = [[[UITableViewCell alloc] $ $ $ $ initWithStyle:UITableViewCellStyleSubtitle $ $ $ $ reuseIdentifier:CellIdentifier] autorelease];$ }$ Song *song = (Song *)[fetchController objectAtIndexPath:indexPath];$ cell.textLabel.text = song.title;$ cell.detailTextLabel.text = song.genre;$ return cell;}

sreda, 16. december 2009

Page 28: Core Data

Core Data2. del, Praksa - demo time

sreda, 16. december 2009

Page 29: Core Data

Core Data3. del, Q&A

sreda, 16. december 2009