Core Data
                iz iPhone vidika




                           Matej Bukovinski
                           www.bukovinski.com




sreda, 16. december 2009
Agenda
                •    Malo teorije (z kodo)
                •    Malo prakse (preprost Xcode demo)
                •    Q&A




sreda, 16. december 2009
Core Data
                1. del, Teorija




sreda, 16. december 2009
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
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
Slabosti
                •    Nekateri (Aaron) imajo rajši popolni nadzor nad tem
                     kaj se dogaja z objekti v ozadju




sreda, 16. december 2009
Core Data sklad

                            NSManagedObjectContext
                             NSManagedObject    NSManagedObject
                              NSManagedObject    NSManagedObject




                           NSPresistentStoreCoordinator

     Entitetni model


                                    NSPresistentStore

                                                                   Podatkovna shramba
                                                                       (npr. SQLite)
sreda, 16. december 2009
Core Data sklad

                            NSManagedObjectContext
                             NSManagedObject    NSManagedObject
                              NSManagedObject    NSManagedObject




                           NSPresistentStoreCoordinator

     Entitetni model


                                    NSPresistentStore

                                                                   Podatkovna shramba
                                                                         (SQL, ...)
sreda, 16. december 2009
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
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
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
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
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
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
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
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
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
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
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
Brisanje objektov
                // Samo podamo konkretno “Song” instanco
                [self.managedObjectContext deleteObject:song];




sreda, 16. december 2009
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
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
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
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
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
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
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
Core Data
                2. del, Praksa - demo time




sreda, 16. december 2009
Core Data
                3. del, Q&A




sreda, 16. december 2009

More Related Content

PPTX
2014 it - app dev series - 03 - interagire con il database
PPTX
Setmana Dactivitats Extraudinaries
PPT
Tallers de Nadal
PDF
Bemviver 3
PPT
Expo Fontagro Modulo De Comunicaciones
PDF
charlesgrahamfinrabrokercheckreport
PDF
20061220 pfc-swaml
2014 it - app dev series - 03 - interagire con il database
Setmana Dactivitats Extraudinaries
Tallers de Nadal
Bemviver 3
Expo Fontagro Modulo De Comunicaciones
charlesgrahamfinrabrokercheckreport
20061220 pfc-swaml

Recently uploaded (8)

PDF
levelling full chapter with examples and questions
PDF
Materi seni rupa untuk sekolah dasar materi tentang seni rupa
PPTX
Madison dsfnsd dslsf sada;sdmas;ds;dls.pptx
PDF
Cold positive punishment of the student سزادانی ئەرێنی ساردی قوتابی.pdf
PPTX
Presentation on chemistry class 11 and class 12
PDF
15 AUG 2025 PS 15 AUG 2025 PS 15 AUG 2025 PS
PDF
فورمولر عمومی مضمون فزیک برای همه انجنیران
PDF
5.PDFsxcc c fvfvfv fvfvwCCDSDcvvcrdcfrwcwecwdcfwe
levelling full chapter with examples and questions
Materi seni rupa untuk sekolah dasar materi tentang seni rupa
Madison dsfnsd dslsf sada;sdmas;ds;dls.pptx
Cold positive punishment of the student سزادانی ئەرێنی ساردی قوتابی.pdf
Presentation on chemistry class 11 and class 12
15 AUG 2025 PS 15 AUG 2025 PS 15 AUG 2025 PS
فورمولر عمومی مضمون فزیک برای همه انجنیران
5.PDFsxcc c fvfvfv fvfvwCCDSDcvvcrdcfrwcwecwdcfwe
Ad
Ad

Core Data

  • 1. Core Data iz iPhone vidika Matej Bukovinski www.bukovinski.com sreda, 16. december 2009
  • 2. Agenda • Malo teorije (z kodo) • Malo prakse (preprost Xcode demo) • Q&A sreda, 16. december 2009
  • 3. Core Data 1. del, Teorija sreda, 16. december 2009
  • 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. 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. Slabosti • Nekateri (Aaron) imajo rajši popolni nadzor nad tem kaj se dogaja z objekti v ozadju sreda, 16. december 2009
  • 7. Core Data sklad NSManagedObjectContext NSManagedObject NSManagedObject NSManagedObject NSManagedObject NSPresistentStoreCoordinator Entitetni model NSPresistentStore Podatkovna shramba (npr. SQLite) sreda, 16. december 2009
  • 8. Core Data sklad NSManagedObjectContext NSManagedObject NSManagedObject NSManagedObject NSManagedObject NSPresistentStoreCoordinator Entitetni model NSPresistentStore Podatkovna shramba (SQL, ...) sreda, 16. december 2009
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Brisanje objektov // Samo podamo konkretno “Song” instanco [self.managedObjectContext deleteObject:song]; sreda, 16. december 2009
  • 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. 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. 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. 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. 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. 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. 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. Core Data 2. del, Praksa - demo time sreda, 16. december 2009
  • 29. Core Data 3. del, Q&A sreda, 16. december 2009