Beginners Guide to TikTok for Search - Rachel Pearson - We are Tilt __ Bright...
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