CocoaHeads Toulouse - Getting to the core of Core Data

Embed Size (px)

Text of CocoaHeads Toulouse - Getting to the core of Core Data

  • 1. Introduction CoreData Partie 1Jrome AlvesRomain BricheMichel Moreau

2. Partie 1 Prsentation des concepts Intgration Modlisation Utilisation basique 3. Partie 11 Concepts avancs Contextes multi-thread Migrations Performance 4. Introduction 5. Introduction Quest-ce que CoreData Framework de gestion de persistance 6. Introduction Quest-ce que CoreData Framework de gestion de persistance Techniques de gestion de persistance Fichiers Property List SQL 7. Elments fondamentaux 8. Elments fondamentauxEntits 9. Elments fondamentauxAttributs Entits 10. Elments fondamentauxAttributs EntitsRelations 11. Types de donnes non-persistantpersistantType de base NSObject NSManagedObject Attributs * * (mais cest compliqu) Mthodes** 12. La pile CoreData 13. La pile CoreDataManaged Object Model A collection of entity descriptions 14. La pile CoreDataManaged Object ContextA collection of managed objectsManaged Object Model A collection of entity descriptions 15. La pile CoreData Managed Object ContextA collection of managed objectsPersistent Store CoordinatorManaged Object Model A collection of storesA collection of entity descriptions 16. La pile CoreData Managed Object ContextA collection of managed objectsPersistent Store CoordinatorManaged Object Model A collection of storesA collection of entity descriptionsPersistent Object StoreA collection of object data 17. La pile CoreData Managed Object ContextA collection of managed objectsPersistent Store CoordinatorManaged Object Model A collection of storesA collection of entity descriptionsPersistent Object StoreA collection of object data Store File 18. La pile CoreData 19. Core Data vs MVCController ViewModel 20. Core Data vs MVCController ViewModelCoreData 21. Core Data vs MVCController ViewModelModelCoreData 22. Core Data vs MVCController ViewModelModelCloudCoreData 23. Cration du modle 24. Fichier .xcdatamodel 25. Le Model Editor 26. Cration dentits 27. Crations dattributs 28. Types dattributs Nondni Chanede Entierscaractres Dcimal Boolen - plus prcis Date Double Binaire Flottant Transformable 29. Proprits Optionnel Transcient - non persist - requiert accesseurs - mocations observables - migration facile Index - performance 30. Relations 31. Relations inverses 32. Rgles de suppression Pasdaction Nullit Cascade Dni - impossible de supprim si la relation existe encore 33. Proprits avances Fetched properties Fetch requets 34. Et maintenant? 35. Exemple dutilisation// Crer de la requteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *request = [[NSFetchRequest alloc] init];[request setEntity:[NSEntityDescription entityForName:@"Enfant" inManagedObjectContext:moc]];// Rcupration dun objetNSError *error = nil;NSManagedObject *enfant = [[moc executeFetchRequest:request error:&error]lastObject];[request release];// Cration dun objetif (!enfant) { enfant = [NSEntityDescription insertNewObjectForEntityForName:@"Enfant"inManagedObjectContext:moc];}// Passage de valeur[enfant setValue:@"Harry" forKey:@"prenom"];[enfant setValue:@"Potter" forKey:@"nom"]; 36. KVC Accs gnrique un attribut dun objet- exemple: attribut prenom de lobjet enfant Binding pendant le Runtime- nom de lattribut non connu au moment de la compilation- Erreur Unknown value for key ... Logique- Cherche pour un accesseur- Cherche pour une variable- Cherche valueForUndenedKey:/setValueForUndenedKey: Compatibilit- OBJ-C 2.0 @property/@synthesize 37. KVO Notications- exemple: changement de la valeur dun attribut Mthodes- willAccessValueForKey: / didAccessValueForKey:- willChangeValueForKey: / didChangeValueForKey:- ... 38. KVO/KVC NSObject-> OK NSManagedObject -> !OK 39. Intrt Sous-Classe Compatible KVC- prenom- setPrenom:- ... Cration de classes personnalises- nomComplet- ... 40. Sous-classes 41. Sous-classes 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. 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. Sous-classes 45. Exemple dutilisation// Crer de la requteNSManagedObjectContext *moc = [self managedObjectContext];NSFetchRequest *request = [[NSFetchRequest alloc] init];[request setEntity:[NSEntityDescription entityForName:@"Enfant" inManagedObjectContext:moc]];// Rcupration dun objetNSError *error = nil;Enfant *enfant = [[moc executeFetchRequest:request error:&error] lastObject];[request release];// Cration dun objetif (!enfant) { enfant = [NSEntityDescription insertNewObjectForEntityForName:@"Enfant"inManagedObjectContext:moc];}// Passage de valeur[enfant setPrenom:@"Harry"];[enfant setNom:@"Potter"]; 46. NE PAS OVERRIDER -init- ne fonctionne pas comme -init de NSObject- modie la structure mais les donnes sont absentes -dealloc- Ne se produit pas quand espr- Core Data gre la gestion mmoire au sein de la classe 47. ALTERNATIVES -awakeFromInsert - lors de la cration - appele 1 seule et unique fois -awakeFromFetch - appele chaque fois que lobjet est retourn (non cr) -willTurnIntoFault - appele lors que lobjet est rellement dtruit ... - voir la documentation 48. Attention lamodication du modle 49. Dmo 50. Oprations de base Ajouter un lment Supprimer un lment Crer une requte Prdicat Sort Descriptor Sauvegarde 51. Insertion dlment// Demande de cration dun managedObject au contexte, dans une entitprciseEvent *event = (Event *)[NSEntityDescriptioninsertNewObjectForEntityForName:@"Event"inManagedObjectContext:managedObjectContext]; 52. Suppression dlment// Obtenir lobjet a supprimerNSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];// Demande de suppresion au contexte[managedObjectContext deleteObject:eventToDelete]; 53. Les requtes Une requte : Un prdicat Un sortDescriptor Execution 54. Les requtesRequte 55. Les requtesRequtePrdicat 56. Les requtesRequtePrdicat 57. Les requtesRequtePrdicatSortDescriptor 58. Les requtesRequtePrdicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor 59. Les requtes Requte PrdicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor 60. Les requtes Requte PrdicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptor Entit 61. Les requtes Requte PrdicatSortDescriptorSortDescriptorSortDescriptorSortDescriptorSortDescriptorEntit 62. Les requtes// Crer de la requteNSFetchRequest *request = [[NSFetchRequest alloc] init];// Obtenir lentitNSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"inManagedObjectContext:managedObjectContext];[request setEntity:entity];// Crer un prdicatNSPredicate *predicate = [NSPredicate predicateWithFormat:@"(lastName LIKE[c] Worsley) AND (salary > %@)", minimumSalary];[request setPredicate:predicate]; 63. Les requtes// Crer un sortDescriptorNSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:NO];NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];[request setSortDescriptors:sortDescriptors];[sortDescriptors release];[sortDescriptor release];// Excuter la requteNSError *error = nil;NSArray *array = [moc executeFetchRequest:request error:&error];if (array == nil){// Deal with error...} 64. Sauvegarde du contexteMO MOManaged Object ContextMO MO MO Persistent Store Coordinator Managed Object Model Persistent Object StoreStore File 65. Sauvegarde du contexteManaged Object Context Persistent Store Coordinator Managed Object Model Persistent Object StoreMO MO MOMOMOStore File 66. Sauvegarde du contexte// NSError *error = nil; if (![managedObjectContext save:&error]) { // Handle the error. } 67. Dmo 68. NSFetchedResultsController Seulement pour iOS - Pas (encore) sur Mac Observations des changements - Notie le contrleur quil doit rafrachir lUI - Notications slectives => meilleure performance - Objets/proprits -willTurnIntoFault - appele lors que lobjet est rellement dtruit ... - voir la documentation 69. Trve de blabla@interface ViewController : UITableViewController{" NSFetchedResultsController *fetchedResultsController;" NSManagedObjectContext *moc;}@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;@property (nonatomic, retain) NSManagedObjectContext *moc; 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:fetchRequestmanagedObjectContext:[self moc]sectionNameKeyPath:nil cacheName:@"Potter"];[frc setDelegate:self];[self setFetchedResultsController:frc];[frc re