13. La pile CoreData
Managed Object Model
A collection of entity descriptions
14. La pile CoreData
Managed Object Context
A collection of managed objects
Managed Object Model
A collection of entity descriptions
15. La pile CoreData
Managed Object Context
A collection of managed objects
Persistent Store Coordinator Managed Object Model
A collection of stores A collection of entity descriptions
16. La pile CoreData
Managed Object Context
A collection of managed objects
Persistent Store Coordinator Managed Object Model
A collection of stores A collection of entity descriptions
Persistent Object Store
A collection of object data
17. La pile CoreData
Managed Object Context
A collection of managed objects
Persistent Store Coordinator Managed Object Model
A collection of stores A collection of entity descriptions
Persistent Object Store
A collection of object data
Store File
35. Exemple d’utilisation
// Créer de la requête
NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Enfant"
inManagedObjectContext:moc]];
// Récupération d’un objet
NSError *error = nil;
NSManagedObject *enfant = [[moc executeFetchRequest:request error:&error]
lastObject];
[request release];
// Création d’un objet
if (!enfant) {
enfant = [NSEntityDescription insertNewObjectForEntityForName:@"Enfant"
inManagedObjectContext:moc];
}
// Passage de valeur
[enfant setValue:@"Harry" forKey:@"prenom"];
[enfant setValue:@"Potter" forKey:@"nom"];
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. KVO
‣ Notifications
- exemple: changement de la valeur d’un attribut
‣ Méthodes
- willAccessValueForKey: / didAccessValueForKey:
- willChangeValueForKey: / didChangeValueForKey:
- ...
45. Exemple d’utilisation
// Créer de la requête
NSManagedObjectContext *moc = [self managedObjectContext];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:[NSEntityDescription entityForName:@"Enfant"
inManagedObjectContext:moc]];
// Récupération d’un objet
NSError *error = nil;
Enfant *enfant = [[moc executeFetchRequest:request error:&error] lastObject];
[request release];
// Création d’un objet
if (!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
- 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. 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
50. Opérations de base
• Ajouter un élément
• Supprimer un élément
• Créer une requête
• Prédicat
• Sort Descriptor
• Sauvegarde
51. Insertion d’élément
// Demande de création d’un managedObject au contexte, dans une entité
précise
Event *event = (Event *)[NSEntityDescription
insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:managedObjectContext];
52. Suppression d’élément
// Obtenir l’objet a supprimer
NSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];
// Demande de suppresion au contexte
[managedObjectContext deleteObject:eventToDelete];
53. Les requêtes
• Une requête :
• Un prédicat
• Un sortDescriptor
• Execution
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