Introduction à                  CoreData                     Partie 1Jérome AlvesRomain BricheMichel Moreau
Partie 1• Présentation des concepts• Intégration• Modélisation• Utilisation basique
Partie 11• Concepts avancés• Contextes multi-thread• Migrations• Performance
Introduction
Introduction• Qu’est-ce que CoreData •   Framework de gestion de persistance
Introduction• Qu’est-ce que CoreData •   Framework de gestion de persistance• Techniques de gestion de persistance •   Fic...
Eléments fondamentaux
Eléments fondamentaux                  Entités
Eléments fondamentauxAttributs             Entités
Eléments fondamentauxAttributs               Entités            Relations
Types de données               non-persistant      persistantType de base     NSObject       NSManagedObject Attributs    ...
La pile CoreData
La pile CoreData            Managed Object Model             A collection of entity descriptions
La pile CoreDataManaged Object Context  A collection of managed objects                                    Managed Object ...
La pile CoreData Managed Object Context    A collection of managed objectsPersistent Store Coordinator          Managed Ob...
La pile CoreData Managed Object Context    A collection of managed objectsPersistent Store Coordinator          Managed Ob...
La pile CoreData Managed Object Context    A collection of managed objectsPersistent Store Coordinator          Managed Ob...
La pile CoreData
Core Data vs MVC  Controller   View    Model
Core Data vs MVC  Controller   View    Model  CoreData
Core Data vs MVC        Controller   View          ModelModel        CoreData
Core Data vs MVC        Controller   View          ModelModel                            Cloud        CoreData
Création du modèle
Fichier .xcdatamodel
Le Model Editor
Création d’entités
Créations d’attributs
Types d’attributs‣ Non  défini       ‣ Chaîne  de‣ Entiers            caractères‣ Décimal          ‣ Booléen -   plus préci...
Propriétés‣ Optionnel‣ Transcient   - non persisté   - requiert accesseurs   - mofications observables   - migration facile...
Relations
Relations inverses
Règles de suppression‣ Pasd’action‣ Nullité‣ Cascade‣ Déni -   impossible de supprimé si la relation existe encore
Propriétés avancées‣ Fetched properties‣ Fetch requets
Et maintenant?
Exemple d’utilisation// Créer de la requêteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *reque...
KVC‣ Accès “générique” à un attribut d’un objet  - exemple: attribut “prenom” de l’objet “enfant”‣ Binding pendant le Runt...
KVO‣ Notifications  - exemple: changement de la valeur d’un attribut‣ Méthodes  - willAccessValueForKey: / didAccessValueFo...
KVO/KVC‣ NSObject        -> OK‣ NSManagedObject -> !OK
Intérêt Sous-Classe‣ Compatible KVC  - prenom  - setPrenom:  - ...‣ Création de classes   personnalisées  - nomComplet  - ...
Sous-classes
Sous-classes
Header@class Parent;@interface Enfant : NSManagedObject {@private// Pas de variables}@property (nonatomic, retain) NSStrin...
Implementation#import "Enfant.h"#import "Parent.h"@implementation Enfant@dynamic nom, prenom, dateNaissance, parents;- (vo...
Sous-classes
Exemple d’utilisation// Créer de la requêteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *reque...
NE PAS “OVERRIDER”‣ -init  - ne fonctionne pas comme -init de NSObject  - modifie la structure mais les données sont absent...
ALTERNATIVES‣ -awakeFromInsert   - lors de la création   - appelée 1 seule et unique fois‣ -awakeFromFetch   - appelée à c...
Attention à lamodification du modèle
Démo
Opérations de base• Ajouter un élément• Supprimer un élément• Créer une requête • Prédicat • Sort Descriptor• Sauvegarde
Insertion d’élément// Demande de création d’un managedObject au contexte, dans une entitépréciseEvent *event = (Event *)[N...
Suppression d’élément// Obtenir l’objet a supprimerNSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.r...
Les requêtes• Une requête : • Un prédicat • Un sortDescriptor• Execution
Les requêtesRequête
Les requêtesRequête            Prédicat
Les requêtesRequêtePrédicat
Les requêtesRequêtePrédicat            SortDescriptor
Les requêtesRequêtePrédicat            SortDescriptor            SortDescriptor            SortDescriptor            SortD...
Les requêtes   Requête   PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor
Les requêtes   Requête   PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor                 En...
Les requêtes   Requête   PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor    Entité
Les requêtes// Créer de la requêteNSFetchRequest *request = [[NSFetchRequest alloc] init];// Obtenir l’entitéNSEntityDescr...
Les requêtes// Créer un sortDescriptorNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationD...
Sauvegarde du contexte                              MO                               MO  Managed Object Context           ...
Sauvegarde du contexte  Managed Object Context Persistent Store Coordinator   Managed Object Model   Persistent Object Sto...
Sauvegarde du contexte// NSError *error = nil;       if (![managedObjectContext save:&error]) {           // Handle the er...
Démo
NSFetchedResultsController‣ Seulement pour iOS   - Pas (encore) sur Mac‣ Observations des changements   - Notifie le contrô...
Trève de blabla@interface ViewController : UITableViewController<NSFetchedResultsControllerDelegate>{" NSFetchedResultsCon...
- (NSFetchedResultsController*)fetchedResultsController{  if (_fetchedResultsController) return _fetchedResultsController;...
NSFetchedResultsControllerDelegate‣ -controllerWillChangeContent:‣ -controller:didChangeSection:atIndex:forChangeType:‣   ...
NSFetchedResultsControllerDelegate
Pour aller plus loin‣ Les opérations  - @sum, @distincUnionOfSets, etc...‣ Les migrations  - automatique, mapping model, m...
Suggestions de ressourcesNouveautés iOS5iCloud, concurrence, protection, …
Merci
Prochain SlideShare
Chargement dans…5
×

CocoaHeads Toulouse - Getting to the core of Core Data

3 678 vues

Publié le

0 commentaire
1 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 678
Sur SlideShare
0
Issues des intégrations
0
Intégrations
1 448
Actions
Partages
0
Téléchargements
18
Commentaires
0
J’aime
1
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

CocoaHeads Toulouse - Getting to the core of Core Data

  1. 1. Introduction à CoreData Partie 1Jérome AlvesRomain BricheMichel Moreau
  2. 2. Partie 1• Présentation des concepts• Intégration• Modélisation• Utilisation basique
  3. 3. Partie 11• Concepts avancés• Contextes multi-thread• Migrations• Performance
  4. 4. Introduction
  5. 5. Introduction• Qu’est-ce que CoreData • Framework de gestion de persistance
  6. 6. Introduction• Qu’est-ce que CoreData • Framework de gestion de persistance• Techniques de gestion de persistance • Fichiers • Property List • SQL
  7. 7. Eléments fondamentaux
  8. 8. Eléments fondamentaux Entités
  9. 9. Eléments fondamentauxAttributs Entités
  10. 10. Eléments fondamentauxAttributs Entités Relations
  11. 11. Types de données non-persistant persistantType de base NSObject NSManagedObject Attributs * * (mais c’est compliqué) Méthodes * *
  12. 12. La pile CoreData
  13. 13. La pile CoreData Managed Object Model A collection of entity descriptions
  14. 14. La pile CoreDataManaged Object Context A collection of managed objects Managed Object Model A collection of entity descriptions
  15. 15. La pile CoreData Managed Object Context A collection of managed objectsPersistent Store Coordinator Managed Object Model A collection of stores A collection of entity descriptions
  16. 16. La pile CoreData Managed Object Context A collection of managed objectsPersistent Store Coordinator Managed Object Model A collection of stores A collection of entity descriptions Persistent Object Store A collection of object data
  17. 17. La pile CoreData Managed Object Context A collection of managed objectsPersistent Store Coordinator Managed Object Model A collection of stores A collection of entity descriptions Persistent Object Store A collection of object data Store File
  18. 18. La pile CoreData
  19. 19. Core Data vs MVC Controller View Model
  20. 20. Core Data vs MVC Controller View Model CoreData
  21. 21. Core Data vs MVC Controller View ModelModel CoreData
  22. 22. Core Data vs MVC Controller View ModelModel Cloud CoreData
  23. 23. Création du modèle
  24. 24. Fichier .xcdatamodel
  25. 25. Le Model Editor
  26. 26. Création d’entités
  27. 27. Créations d’attributs
  28. 28. Types d’attributs‣ Non défini ‣ Chaîne de‣ Entiers caractères‣ Décimal ‣ Booléen - plus précis ‣ Date‣ Double ‣ Binaire‣ Flottant ‣ Transformable
  29. 29. Propriétés‣ Optionnel‣ Transcient - non persisté - requiert accesseurs - mofications observables - migration facile‣ Indexé - performance
  30. 30. Relations
  31. 31. Relations inverses
  32. 32. Règles de suppression‣ Pasd’action‣ Nullité‣ Cascade‣ Déni - impossible de supprimé si la relation existe encore
  33. 33. Propriétés avancées‣ Fetched properties‣ Fetch requets
  34. 34. Et maintenant?
  35. 35. Exemple d’utilisation// Créer de la requêteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *request = [[NSFetchRequest alloc] init];[request setEntity:[NSEntityDescription entityForName:@"Enfant" inManagedObjectContext:moc]];// Récupération d’un objetNSError *error = nil;NSManagedObject *enfant = [[moc executeFetchRequest:request error:&error]lastObject];[request release];// Création d’un objetif (!enfant) { enfant = [NSEntityDescription insertNewObjectForEntityForName:@"Enfant" inManagedObjectContext:moc];}// Passage de valeur[enfant setValue:@"Harry" forKey:@"prenom"];[enfant setValue:@"Potter" forKey:@"nom"];
  36. 36. KVC‣ Accès “générique” à un attribut d’un objet - exemple: attribut “prenom” de l’objet “enfant”‣ Binding pendant le Runtime - nom de l’attribut non connu au moment de la compilation - Erreur “Unknown value for key ...”‣ Logique - Cherche pour un accesseur - Cherche pour une variable - Cherche valueForUndefinedKey:/setValueForUndefinedKey:‣ Compatibilité - OBJ-C 2.0 @property/@synthesize
  37. 37. KVO‣ Notifications - exemple: changement de la valeur d’un attribut‣ Méthodes - willAccessValueForKey: / didAccessValueForKey: - willChangeValueForKey: / didChangeValueForKey: - ...
  38. 38. KVO/KVC‣ NSObject -> OK‣ NSManagedObject -> !OK
  39. 39. Intérêt Sous-Classe‣ Compatible KVC - prenom - setPrenom: - ...‣ Création de classes personnalisées - nomComplet - ...
  40. 40. Sous-classes
  41. 41. Sous-classes
  42. 42. Header@class Parent;@interface Enfant : NSManagedObject {@private// Pas de variables}@property (nonatomic, retain) NSString * nom;@property (nonatomic, retain) NSString * prenom;@property (nonatomic, retain) NSDate * dateNaissance;@property (nonatomic, retain) NSSet* parents;@end
  43. 43. Implementation#import "Enfant.h"#import "Parent.h"@implementation Enfant@dynamic nom, prenom, dateNaissance, parents;- (void)addParentsObject:(Parent *)value { NSSet *changedObjects = [[NSSet alloc] initWithObjects:&value count:1]; [self willChangeValueForKey:@"parents" withSetMutation:NSKeyValueUnionSetMutationusingObjects:changedObjects]; [[self primitiveValueForKey:@"parents"] addObject:value]; [self didChangeValueForKey:@"parents" withSetMutation:NSKeyValueUnionSetMutationusingObjects:changedObjects]; [changedObjects release];}- (void)removeParentsObject:(Parent *)value {...}- (void)addParents:(NSSet *)value {...}- (void)removeParents:(NSSet *)value {...}@end
  44. 44. Sous-classes
  45. 45. Exemple d’utilisation// Créer de la requêteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *request = [[NSFetchRequest alloc] init];[request setEntity:[NSEntityDescription entityForName:@"Enfant" inManagedObjectContext:moc]];// Récupération d’un objetNSError *error = nil;Enfant *enfant = [[moc executeFetchRequest:request error:&error] lastObject];[request release];// Création d’un objetif (!enfant) { enfant = [NSEntityDescription insertNewObjectForEntityForName:@"Enfant" inManagedObjectContext:moc];}// Passage de valeur[enfant setPrenom:@"Harry"];[enfant setNom:@"Potter"];
  46. 46. NE PAS “OVERRIDER”‣ -init - ne fonctionne pas comme -init de NSObject - modifie la structure mais les données sont absentes‣ -dealloc - Ne se produit pas quand espéré - Core Data “gère la gestion mémoire” au sein de la classe
  47. 47. ALTERNATIVES‣ -awakeFromInsert - lors de la création - appelée 1 seule et unique fois‣ -awakeFromFetch - appelée à chaque fois que l’objet est retourné (non créé)‣ -willTurnIntoFault - appelée lors que l’objet est réellement détruit‣ ... - voir la documentation
  48. 48. Attention à lamodification du modèle
  49. 49. Démo
  50. 50. Opérations de base• Ajouter un élément• Supprimer un élément• Créer une requête • Prédicat • Sort Descriptor• Sauvegarde
  51. 51. Insertion d’élément// Demande de création d’un managedObject au contexte, dans une entitépréciseEvent *event = (Event *)[NSEntityDescriptioninsertNewObjectForEntityForName:@"Event"inManagedObjectContext:managedObjectContext];
  52. 52. Suppression d’élément// Obtenir l’objet a supprimerNSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];// Demande de suppresion au contexte[managedObjectContext deleteObject:eventToDelete];
  53. 53. Les requêtes• Une requête : • Un prédicat • Un sortDescriptor• Execution
  54. 54. Les requêtesRequête
  55. 55. Les requêtesRequête Prédicat
  56. 56. Les requêtesRequêtePrédicat
  57. 57. Les requêtesRequêtePrédicat SortDescriptor
  58. 58. Les requêtesRequêtePrédicat SortDescriptor SortDescriptor SortDescriptor SortDescriptor SortDescriptor
  59. 59. Les requêtes Requête PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor
  60. 60. Les requêtes Requête PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor Entité
  61. 61. Les requêtes Requête PrédicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor Entité
  62. 62. Les requêtes// Créer de la requêteNSFetchRequest *request = [[NSFetchRequest alloc] init];// Obtenir l’entitéNSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"inManagedObjectContext:managedObjectContext];[request setEntity:entity];// Créer un prédicatNSPredicate *predicate = [NSPredicate predicateWithFormat:    @"(lastName LIKE[c] Worsley) AND (salary > %@)", minimumSalary];[request setPredicate:predicate];
  63. 63. Les requêtes// Créer un sortDescriptorNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];[request setSortDescriptors:sortDescriptors];[sortDescriptors release];[sortDescriptor release];// Exécuter la requêteNSError *error = nil;NSArray *array = [moc executeFetchRequest:request error:&error];if (array == nil){    // Deal with error...}
  64. 64. Sauvegarde du contexte MO MO Managed Object Context MO MO MO Persistent Store Coordinator Managed Object Model Persistent Object Store Store File
  65. 65. Sauvegarde du contexte Managed Object Context Persistent Store Coordinator Managed Object Model Persistent Object Store MO MO MO MO MO Store File
  66. 66. Sauvegarde du contexte// NSError *error = nil; if (![managedObjectContext save:&error]) { // Handle the error. }
  67. 67. Démo
  68. 68. NSFetchedResultsController‣ Seulement pour iOS - Pas (encore) sur Mac‣ Observations des changements - Notifie le contrôleur qu’il doit rafraîchir l’UI - Notifications sélectives => meilleure performance - Objets/propriétés‣ -willTurnIntoFault - appelée lors que l’objet est réellement détruit‣ ... - voir la documentation
  69. 69. Trève de blabla@interface ViewController : UITableViewController<NSFetchedResultsControllerDelegate>{" NSFetchedResultsController *fetchedResultsController;" NSManagedObjectContext *moc;}@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;@property (nonatomic, retain) NSManagedObjectContext *moc;
  70. 70. - (NSFetchedResultsController*)fetchedResultsController{ if (_fetchedResultsController) return _fetchedResultsController; NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; NSEntityDescription *entity = [NSEntityDescription entityForName:@"Enfant" inManagedObjectContext:[self moc]]; [fetchRequest setEntity:entity]; [fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"nom==%@",@"Potter"]]; [fetchRequest setFetchBatchSize:20]; NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"prenom" ascending:YES]; NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; [fetchRequest setSortDescriptors:sortDescriptors]; NSFetchedResultsController *frc = nil; frc = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:[self moc] sectionNameKeyPath:nil cacheName:@"Potter"]; [frc setDelegate:self]; [self setFetchedResultsController:frc]; [frc release], frc = nil; [fetchRequest release], fetchRequest = nil; [sortDescriptor release], sortDescriptor = nil; [sortDescriptors release], sortDescriptors = nil; return _fetchedResultsController;}
  71. 71. NSFetchedResultsControllerDelegate‣ -controllerWillChangeContent:‣ -controller:didChangeSection:atIndex:forChangeType:‣ -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:‣ -controllerDidChangeContent:
  72. 72. NSFetchedResultsControllerDelegate
  73. 73. Pour aller plus loin‣ Les opérations - @sum, @distincUnionOfSets, etc...‣ Les migrations - automatique, mapping model, manuelle‣ Notions avancées - multi-threading, données binaire, faulting, synchronisation‣ Performance‣ Nouveautés iOS5 - iCloud, concurrence, protection, …
  74. 74. Suggestions de ressourcesNouveautés iOS5iCloud, concurrence, protection, …
  75. 75. Merci

×