Core Data

1,797 views
1,748 views

Published on

Core Data za iPhone. Prezentacija iz MobDev Slovenia (http://www.meetup.com/mobdev/).

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
1,797
On SlideShare
0
From Embeds
0
Number of Embeds
9
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Core Data

  1. 1. Core Data iz iPhone vidika Matej Bukovinski www.bukovinski.com sreda, 16. december 2009
  2. 2. Agenda • Malo teorije (z kodo) • Malo prakse (preprost Xcode demo) • Q&A sreda, 16. december 2009
  3. 3. Core Data 1. del, Teorija sreda, 16. december 2009
  4. 4. 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
  5. 5. 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
  6. 6. Slabosti • Nekateri (Aaron) imajo rajši popolni nadzor nad tem kaj se dogaja z objekti v ozadju sreda, 16. december 2009
  7. 7. Core Data sklad NSManagedObjectContext NSManagedObject NSManagedObject NSManagedObject NSManagedObject NSPresistentStoreCoordinator Entitetni model NSPresistentStore Podatkovna shramba (npr. SQLite) sreda, 16. december 2009
  8. 8. Core Data sklad NSManagedObjectContext NSManagedObject NSManagedObject NSManagedObject NSManagedObject NSPresistentStoreCoordinator Entitetni model NSPresistentStore Podatkovna shramba (SQL, ...) sreda, 16. december 2009
  9. 9. Core Data, uporaba v praksi 1 2 NSManagedObjectContext NSManagedObject NSManagedObject NSManagedObject NSManagedObject Entitetni model + NSFetchRequest • Narišemo (ali spišemo) entitetni • Nad NSManagedObjectContext izvajamo splošne model, ki predstavlja naše poslovne operacije (shranjevanje, nalaganje, dodajanje modelnih objekte objektov) • Tu določimo entitete, razmerja med • Poizvedbe oblikujemo z NSFechRequest (podobno kot njimi entitetami, atibute, omejitve... SQL) • Po potrebi generiramo izvorno kodo v • Entitete so predstavljene z objekti, ki dedujejo od kateri lahko dodajamo dodatno logiko NSManagedObject, z njimi ravnamo kot z običajnimi modelnim objektov Objective-C objekti sreda, 16. december 2009
  10. 10. 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
  11. 11. 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
  12. 12. Nalaganje iz shrambe // Ustvarimo fetch request (poizvedba) NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; // Povemo katera entiteta nas zanima NSEntityDescription *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 objekte NSError *error; NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error]; sreda, 16. december 2009
  13. 13. Nalaganje iz shrambe // Ustvarimo fetch request (poizvedba) NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; // Povemo katera entiteta nas zanima NSEntityDescription *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 objekte NSError *error; NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error]; sreda, 16. december 2009
  14. 14. Nalaganje iz shrambe // Ustvarimo fetch request (poizvedba) NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; // Povemo katera entiteta nas zanima NSEntityDescription *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 objekte NSError *error; NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error]; sreda, 16. december 2009
  15. 15. Nalaganje iz shrambe // Ustvarimo fetch request (poizvedba) NSFetchRequest *fetchRequest = [[[NSFetchRequest alloc] init] autorelease]; // Povemo katera entiteta nas zanima NSEntityDescription *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 objekte NSError *error; NSArray *songs = [managedObjectContext executeFetchRequest:request error:&error]; sreda, 16. december 2009
  16. 16. Shranjevanje sprememb NSError *error; // Če ni sprememb ni potrebno shranjevati if ([managedObjectContext hasChanges]) { $ // Shranjevanje vseh sprememb - 1 vrstica kode! $ if (![managedObjectContext save:&error]) { $ $ // Poskrbi za napako $ } } sreda, 16. december 2009
  17. 17. Shranjevanje sprememb NSError *error; // Če ni sprememb ni potrebno shranjevati if ([managedObjectContext hasChanges]) { $ // Shranjevanje vseh sprememb - 1 vrstica kode! $ if (![managedObjectContext save:&error]) { $ $ // Poskrbi za napako $ } } sreda, 16. december 2009
  18. 18. Dodajanje novih objektov // Ponavadi uporabljamo NSEntityDescription za ustvarjanje novih entitet Song *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 objekti newSong.title = @"Yellow Submarine"; sreda, 16. december 2009
  19. 19. Dodajanje novih objektov // Ponavadi uporabljamo NSEntityDescription za ustvarjanje novih entitet Song *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 objekti newSong.title = @"Yellow Submarine"; sreda, 16. december 2009
  20. 20. Brisanje objektov // Samo podamo konkretno “Song” instanco [self.managedObjectContext deleteObject:song]; sreda, 16. december 2009
  21. 21. 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
  22. 22. NSFetchedResultsController inicializacija // Pred tem ustrezno pripravimo fetchRequest self.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
  23. 23. NSFetchedResultsController inicializacija // Pred tem ustrezno pripravimo fetchRequest self.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
  24. 24. 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
  25. 25. 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
  26. 26. 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
  27. 27. 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
  28. 28. Core Data 2. del, Praksa - demo time sreda, 16. december 2009
  29. 29. Core Data 3. del, Q&A sreda, 16. december 2009

×