SlideShare une entreprise Scribd logo
Introduction à
                  CoreData
                     Partie 1




Jérome Alves
Romain Briche
Michel 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
 •   Fichiers

 •   Property List

 •   SQL
Eléments fondamentaux
Eléments fondamentaux


                  Entités
Eléments fondamentaux


Attributs             Entités
Eléments fondamentaux


Attributs               Entités


            Relations
Types de données

               non-persistant      persistant

Type de base     NSObject       NSManagedObject

 Attributs           *             *   (mais c’est compliqué)



 Méthodes            *                        *
La pile CoreData
La pile CoreData

            Managed Object Model

             A collection of entity descriptions
La pile CoreData
Managed Object Context

  A collection of managed objects




                                    Managed Object Model

                                     A collection of entity descriptions
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
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
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
La pile CoreData
Core Data vs MVC

  Controller   View




    Model
Core Data vs MVC

  Controller   View




    Model




  CoreData
Core Data vs MVC

        Controller   View




          Model
Model




        CoreData
Core Data vs MVC

        Controller   View




          Model
Model




                            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écis   ‣ Date
‣ Double           ‣ Binaire
‣ Flottant         ‣ Transformable
Propriétés
‣ Optionnel
‣ Transcient
   - non persisté
   - requiert accesseurs
   - mofications observables
   - migration facile
‣ Indexé
   - performance
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ê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"];
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
KVO

‣ Notifications
  - exemple: changement de la valeur d’un attribut
‣ Méthodes
  - willAccessValueForKey: / didAccessValueForKey:
  - willChangeValueForKey: / didChangeValueForKey:
  - ...
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) NSString * nom;
@property (nonatomic, retain) NSString * prenom;
@property (nonatomic, retain) NSDate * dateNaissance;
@property (nonatomic, retain) NSSet* parents;

@end
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:NSKeyValueUnionSetMutation
usingObjects:changedObjects];
    [[self primitiveValueForKey:@"parents"] addObject:value];
    [self didChangeValueForKey:@"parents" withSetMutation:NSKeyValueUnionSetMutation
usingObjects:changedObjects];
    [changedObjects release];
}

- (void)removeParentsObject:(Parent *)value {...}
- (void)addParents:(NSSet *)value {...}
- (void)removeParents:(NSSet *)value {...}

@end
Sous-classes
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"];
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
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
Attention à la
modification 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écise

Event *event = (Event *)[NSEntityDescription
insertNewObjectForEntityForName:@"Event"
inManagedObjectContext:managedObjectContext];
Suppression d’élément
// Obtenir l’objet a supprimer
NSManagedObject *eventToDelete = [eventsArray objectAtIndex:indexPath.row];

// Demande de suppresion au contexte
[managedObjectContext deleteObject:eventToDelete];
Les requêtes

• Une requête :
 • Un prédicat
 • Un sortDescriptor
• Execution
Les requêtes
Requête
Les requêtes
Requête

            Prédicat
Les requêtes
Requête

Prédicat
Les requêtes
Requête

Prédicat

            SortDescriptor
Les requêtes
Requête

Prédicat

            SortDescriptor
            SortDescriptor
            SortDescriptor
            SortDescriptor
            SortDescriptor
Les requêtes
   Requête

   Prédicat

SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor
Les requêtes
   Requête

   Prédicat

SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor


                 Entité
Les requêtes
   Requête

   Prédicat

SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor
SortDescriptor


    Entité
Les requêtes
// Créer de la requête
NSFetchRequest *request = [[NSFetchRequest alloc] init];


// Obtenir l’entité
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event"
inManagedObjectContext:managedObjectContext];

[request setEntity:entity];



// Créer un prédicat
NSPredicate *predicate = [NSPredicate predicateWithFormat:
    @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary];

[request setPredicate:predicate];
Les requêtes
// Créer un sortDescriptor
NSSortDescriptor *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ête
NSError *error = nil;
NSArray *array = [moc executeFetchRequest:request error:&error];

if (array == nil)
{
    // Deal with error...
}
Sauvegarde du contexte
                              MO
                               MO
  Managed Object Context
                              MO
                               MO
                             MO




 Persistent Store Coordinator       Managed Object Model




   Persistent Object Store




            Store File
Sauvegarde du contexte
  Managed Object Context




 Persistent Store Coordinator   Managed Object Model




   Persistent Object Store



                MO
                 MO
                 MO
                MO
                MO
            Store File
Sauvegarde du contexte
//
 NSError *error = nil;

       if (![managedObjectContext save:&error]) {

           // Handle the error.

       }
Démo
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
Trève de blabla

@interface ViewController : UITableViewController
<NSFetchedResultsControllerDelegate>
{
" NSFetchedResultsController *fetchedResultsController;
" NSManagedObjectContext *moc;
}

@property (nonatomic, retain) NSFetchedResultsController *fetchedResultsController;
@property (nonatomic, retain) NSManagedObjectContext *moc;
- (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;
}
NSFetchedResultsControllerDelegate



‣ -controllerWillChangeContent:
‣ -controller:didChangeSection:atIndex:forChangeType:
‣   -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath:
‣ -controllerDidChangeContent:
NSFetchedResultsControllerDelegate
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, …
Suggestions de ressources


Nouveautés iOS5
iCloud, concurrence, protection, …
Merci

Contenu connexe

Tendances

Mettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JSMettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JS
Matthieu Guillermin
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelier
Algeria JUG
 

Tendances (15)

Atelier : Développement rapide d&rsquo;une application basée surXWiki
Atelier : Développement rapide d&rsquo;une application basée surXWikiAtelier : Développement rapide d&rsquo;une application basée surXWiki
Atelier : Développement rapide d&rsquo;une application basée surXWiki
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Présentation jQuery pour débutant
Présentation jQuery pour débutantPrésentation jQuery pour débutant
Présentation jQuery pour débutant
 
Cours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partieCours php & Mysql - 2éme partie
Cours php & Mysql - 2éme partie
 
Notions de base de JavaScript
Notions de base de JavaScriptNotions de base de JavaScript
Notions de base de JavaScript
 
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
Design patterns et Design Emergeant - Micro Days - Modern Software Developmen...
 
Javascript proprement
Javascript proprementJavascript proprement
Javascript proprement
 
Procédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénientsProcédures CLR pour SQL Server : avantages et inconvénients
Procédures CLR pour SQL Server : avantages et inconvénients
 
Présentation JavaScript
Présentation JavaScriptPrésentation JavaScript
Présentation JavaScript
 
JQuery
JQueryJQuery
JQuery
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
jQuery
jQueryjQuery
jQuery
 
Mettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JSMettez du temps réel dans votre Drupal avec Node JS
Mettez du temps réel dans votre Drupal avec Node JS
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelier
 
Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5Programmation orientée objet en PHP 5
Programmation orientée objet en PHP 5
 

En vedette (6)

CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrenteCocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
CocoaHeads Toulouse - Marc Boudou / FreezySnail - Programmation concurrente
 
What's new in iOS9
What's new in iOS9What's new in iOS9
What's new in iOS9
 
Project Entourage
Project EntourageProject Entourage
Project Entourage
 
BitTorrent on iOS
BitTorrent on iOSBitTorrent on iOS
BitTorrent on iOS
 
Build a lego app with CocoaPods
Build a lego app with CocoaPodsBuild a lego app with CocoaPods
Build a lego app with CocoaPods
 
Let's migrate to Swift 3.0
Let's migrate to Swift 3.0Let's migrate to Swift 3.0
Let's migrate to Swift 3.0
 

Similaire à CocoaHeads Toulouse - Getting to the core of Core Data

Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
Antoine Rey
 
L'architecture MVVM avec KnockoutJS
L'architecture MVVM avec KnockoutJSL'architecture MVVM avec KnockoutJS
L'architecture MVVM avec KnockoutJS
David Bottiau
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
MongoDB
 

Similaire à CocoaHeads Toulouse - Getting to the core of Core Data (20)

FORMATION javascript.pdf
FORMATION javascript.pdfFORMATION javascript.pdf
FORMATION javascript.pdf
 
Introduction à React
Introduction à ReactIntroduction à React
Introduction à React
 
Introduction à React JS
Introduction à React JSIntroduction à React JS
Introduction à React JS
 
Introduction au Jquery
Introduction au JqueryIntroduction au Jquery
Introduction au Jquery
 
Workshop spring session 2 - La persistance au sein des applications Java
Workshop spring   session 2 - La persistance au sein des applications JavaWorkshop spring   session 2 - La persistance au sein des applications Java
Workshop spring session 2 - La persistance au sein des applications Java
 
JAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de donnéesJAVA, JDBC et liaison base de données
JAVA, JDBC et liaison base de données
 
Initiation à Express js
Initiation à Express jsInitiation à Express js
Initiation à Express js
 
L'architecture MVVM avec KnockoutJS
L'architecture MVVM avec KnockoutJSL'architecture MVVM avec KnockoutJS
L'architecture MVVM avec KnockoutJS
 
Android ORMLite
Android   ORMLiteAndroid   ORMLite
Android ORMLite
 
Workshop - Lightning Web Components
Workshop - Lightning Web ComponentsWorkshop - Lightning Web Components
Workshop - Lightning Web Components
 
Workshop Lightning Web Components
Workshop Lightning Web ComponentsWorkshop Lightning Web Components
Workshop Lightning Web Components
 
Modèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratiqueModèle de domaine riche dans une application métier complexe un exemple pratique
Modèle de domaine riche dans une application métier complexe un exemple pratique
 
Introduction à JPA (Java Persistence API )
Introduction à JPA  (Java Persistence API )Introduction à JPA  (Java Persistence API )
Introduction à JPA (Java Persistence API )
 
Symfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 PerformantSymfony2 - Un Framework PHP 5 Performant
Symfony2 - Un Framework PHP 5 Performant
 
Cours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partieCours php & Mysql - 4éme partie
Cours php & Mysql - 4éme partie
 
Ce bon vieux propel
Ce bon vieux propelCe bon vieux propel
Ce bon vieux propel
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01-rev.
 
Softshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décorSoftshake 2013 Apiness SA l'envers du décor
Softshake 2013 Apiness SA l'envers du décor
 
Softshake apiness l'envers du décor
Softshake apiness l'envers du décorSoftshake apiness l'envers du décor
Softshake apiness l'envers du décor
 
Springioc
SpringiocSpringioc
Springioc
 

Plus de CocoaHeads France

Plus de CocoaHeads France (20)

Mutation testing for a safer Future
Mutation testing for a safer FutureMutation testing for a safer Future
Mutation testing for a safer Future
 
iOS App Group for Debugging
iOS App Group for DebuggingiOS App Group for Debugging
iOS App Group for Debugging
 
Asynchronous swift
Asynchronous swiftAsynchronous swift
Asynchronous swift
 
Visual accessibility in iOS11
Visual accessibility in iOS11Visual accessibility in iOS11
Visual accessibility in iOS11
 
My script - One year of CocoaHeads
My script - One year of CocoaHeadsMy script - One year of CocoaHeads
My script - One year of CocoaHeads
 
Ui testing dealing with push notifications
Ui testing dealing with push notificationsUi testing dealing with push notifications
Ui testing dealing with push notifications
 
CONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANECONTINUOUS DELIVERY WITH FASTLANE
CONTINUOUS DELIVERY WITH FASTLANE
 
L'intégration continue avec Bitrise
L'intégration continue avec BitriseL'intégration continue avec Bitrise
L'intégration continue avec Bitrise
 
Super combinators
Super combinatorsSuper combinators
Super combinators
 
Design like a developer
Design like a developerDesign like a developer
Design like a developer
 
Handle the error
Handle the errorHandle the error
Handle the error
 
Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3Quoi de neuf dans iOS 10.3
Quoi de neuf dans iOS 10.3
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
SwiftyGPIO
SwiftyGPIOSwiftyGPIO
SwiftyGPIO
 
Présentation de HomeKit
Présentation de HomeKitPrésentation de HomeKit
Présentation de HomeKit
 
Programme MFI retour d'expérience
Programme MFI retour d'expérienceProgramme MFI retour d'expérience
Programme MFI retour d'expérience
 
How to communicate with Smart things?
How to communicate with Smart things?How to communicate with Smart things?
How to communicate with Smart things?
 
CloudKit as a backend
CloudKit as a backendCloudKit as a backend
CloudKit as a backend
 
Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?Comment faire de HLS votre solution vidéo préférée ?
Comment faire de HLS votre solution vidéo préférée ?
 
Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.Découvrir dtrace en ligne de commande.
Découvrir dtrace en ligne de commande.
 

CocoaHeads Toulouse - Getting to the core of Core Data

  • 1. Introduction à CoreData Partie 1 Jérome Alves Romain Briche Michel Moreau
  • 2. Partie 1 • Présentation des concepts • Intégration • Modélisation • Utilisation basique
  • 3. Partie 11 • Concepts avancés • Contextes multi-thread • Migrations • Performance
  • 5. Introduction • Qu’est-ce que CoreData • Framework de gestion de persistance
  • 6. Introduction • Qu’est-ce que CoreData • Framework de gestion de persistance • Techniques de gestion de persistance • Fichiers • Property List • SQL
  • 10. Eléments fondamentaux Attributs Entités Relations
  • 11. Types de données non-persistant persistant Type de base NSObject NSManagedObject Attributs * * (mais c’est compliqué) Méthodes * *
  • 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
  • 19. Core Data vs MVC Controller View Model
  • 20. Core Data vs MVC Controller View Model CoreData
  • 21. Core Data vs MVC Controller View Model Model CoreData
  • 22. Core Data vs MVC Controller View Model Model Cloud CoreData
  • 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. Propriétés ‣ Optionnel ‣ Transcient - non persisté - requiert accesseurs - mofications observables - migration facile ‣ Indexé - performance
  • 32. Règles de suppression ‣ Pasd’action ‣ Nullité ‣ Cascade ‣ Déni - impossible de supprimé si la relation existe encore
  • 33. Propriétés avancées ‣ Fetched properties ‣ Fetch requets
  • 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: - ...
  • 38. KVO/KVC ‣ NSObject -> OK ‣ NSManagedObject -> !OK
  • 39. Intérêt Sous-Classe ‣ Compatible KVC - prenom - setPrenom: - ... ‣ Création de classes personnalisées - nomComplet - ...
  • 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:NSKeyValueUnionSetMutation usingObjects:changedObjects]; [[self primitiveValueForKey:@"parents"] addObject:value]; [self didChangeValueForKey:@"parents" withSetMutation:NSKeyValueUnionSetMutation usingObjects:changedObjects]; [changedObjects release]; } - (void)removeParentsObject:(Parent *)value {...} - (void)addParents:(NSSet *)value {...} - (void)removeParents:(NSSet *)value {...} @end
  • 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
  • 49. Démo
  • 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
  • 58. Les requêtes Requête Prédicat SortDescriptor SortDescriptor SortDescriptor SortDescriptor SortDescriptor
  • 59. Les requêtes Requête Prédicat SortDescriptor SortDescriptor SortDescriptor SortDescriptor SortDescriptor
  • 60. Les requêtes Requête Prédicat SortDescriptor SortDescriptor SortDescriptor SortDescriptor SortDescriptor Entité
  • 61. Les requêtes Requête Prédicat SortDescriptor SortDescriptor SortDescriptor SortDescriptor SortDescriptor Entité
  • 62. Les requêtes // Créer de la requête NSFetchRequest *request = [[NSFetchRequest alloc] init]; // Obtenir l’entité NSEntityDescription *entity = [NSEntityDescription entityForName:@"Event" inManagedObjectContext:managedObjectContext]; [request setEntity:entity]; // Créer un prédicat NSPredicate *predicate = [NSPredicate predicateWithFormat:     @"(lastName LIKE[c] 'Worsley') AND (salary > %@)", minimumSalary]; [request setPredicate:predicate];
  • 63. Les requêtes // Créer un sortDescriptor NSSortDescriptor *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ête NSError *error = nil; NSArray *array = [moc executeFetchRequest:request error:&error]; if (array == nil) {     // Deal with error... }
  • 64. Sauvegarde du contexte MO MO Managed Object Context MO MO MO Persistent Store Coordinator Managed Object Model Persistent Object Store Store File
  • 65. Sauvegarde du contexte Managed Object Context Persistent Store Coordinator Managed Object Model Persistent Object Store MO MO MO MO MO Store File
  • 66. Sauvegarde du contexte // NSError *error = nil; if (![managedObjectContext save:&error]) { // Handle the error. }
  • 67. Démo
  • 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. Trève de blabla @interface ViewController : UITableViewController <NSFetchedResultsControllerDelegate> { " 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: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. NSFetchedResultsControllerDelegate ‣ -controllerWillChangeContent: ‣ -controller:didChangeSection:atIndex:forChangeType: ‣ -controller:didChangeObject:atIndexPath:forChangeType:newIndexPath: ‣ -controllerDidChangeContent:
  • 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. Suggestions de ressources Nouveautés iOS5 iCloud, concurrence, protection, …
  • 75. Merci