La persistance des données Le modèle Core Data



Documents pareils
Programmation MacOSX / ios

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

PRODIGE V3. Manuel utilisateurs. Consultation des métadonnées

Types d applications pour la persistance. Outils de développement. Base de données préexistante? 3 modèles. Variantes avec passerelles

Can we trust smartphones?

Tutoriel: Création d'un Web service en C++ avec WebContentC++Framework

arcopole Studio Annexe 4 Intégration LDAP et processus d authentification Site du programme arcopole :

Conception d'applications de base de données ios plus rapides Guide Pratique FileMaker

Administration Centrale : Opérations

Procédures Stockées WAVESOFT ws_sp_getidtable Exemple : ws_sp_getnextsouche Exemple :... 12

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Manipulation 4 : Application de «Change».

La GEIDE. Dans une solution GEIDE, il est possible d'associer au sein même d'un dossier:

Plan. Exemple: Application bancaire. Introduction. OCL Object Constraint Language Le langage de contraintes d'uml

GUIDE MEMBRE ESPACE COLLABORATIF. Février 2012

RMI le langage Java XII-1 JMF

Chapitre 2. Classes et objets

MEDIAplus elearning. version 6.6

Guide d utilisation. Version 1.1

1. Installation du Module

LES FONCTIONS DE SURVEILLANCE DES FICHIERS

La technologie Java Card TM

McAfee Security-as-a-Service

Service de certificat

TP n 2 Concepts de la programmation Objets Master 1 mention IL, semestre 2 Le type Abstrait Pile

BIRT (Business Intelligence and Reporting Tools)

Cours 1 : introduction

Annexe 5. Kaspersky Security For SharePoint Servers. Consulting Team

Conception d'un système d'information WEB avec UML Par Ass SERGE KIKOBYA

et Groupe Eyrolles, 2006, ISBN :

Paginer les données côté serveur, mettre en cache côté client

BTS S.I.O PHP OBJET. Module SLAM4. Nom du fichier : PHPRévisionObjetV2.odt Auteur : Pierre Barais

MEGA ITSM Accelerator. Guide de Démarrage

//////////////////////////////////////////////////////////////////// Administration bases de données

Import des utilisateurs depuis Sconet et STSweb - mise à jour du 04/10/06

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

Auguria_PCM Product & Combination Manager

Maarch V1.4

BREVE PRESENTATION DU SERVICE «EDITEURS ACADEMIQUES ENLIGNE» ELISABETH DE PABLO (MSH- ESCOM, 1997)

Tous les autres noms de produits ou appellations sont des marques déposées ou des noms commerciaux appartenant à leurs propriétaires respectifs.

Installation de serveurs DNS, WINS et DHCP sous Windows Server 2003

Encryptions, compression et partitionnement des données

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

SHERLOCK 7. Version du 01/09/09 JAVASCRIPT 1.5

Par Daniel FAIVRE WebMapper ... Publication de cartes pour Internet avec ArcGis

Administration du site (Back Office)

EXTRACTION ET RÉINTÉGRATION DE COMPTA COALA DE LA PME VERS LE CABINET

Utilisation de JAVA coté Application serveur couplé avec Oracle Forms Hafed Benteftifa Novembre 2008

Initiation à JAVA et à la programmation objet.

< Atelier 1 /> Démarrer une application web

Bases de données Oracle Virtual Private Database (VPD) pour la gestion des utilisateurs d applications

UltraBackup NetStation 4. Guide de démarrage rapide

Les journées SQL Server 2013

Création d'un site dynamique en PHP avec Dreamweaver et MySQL

Formation Administrateur de Données Localisées (Prodige V3.2) Recherche et consultation des métadonnées

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Créer une base de données vidéo sans programmation (avec Drupal)

Serveur d Applications Web : WebObjects

CONCOURS DE L AGRÉGATION INTERNE «ÉCONOMIE ET GESTION» SESSION 2015 SECONDE ÉPREUVE

VM Card. Manuel des paramètres des fonctions étendues pour le Web. Manuel utilisateur

Ces envois peuvent être automatiques ou manuels. Nous allons découvrir dans ce manuel comment

Développement d une application partagée pour la gestion du système de qualité (ISO 9001/2008) dans la sucrerie

Service On Line : Gestion des Incidents

Cadastre du bruit SIT-JURA. Connecteur Arcview9.x - MSAccess. Mode d emploi. Appel formulaire. Page 1 sur 15

SYNC FRAMEWORK AVEC SQLITE POUR APPLICATIONS WINDOWS STORE (WINRT) ET WINDOWS PHONE 8

Communiqué de Lancement

Créer et partager des fichiers

Bases de données. Chapitre 1. Introduction

Cours Base de données relationnelles. M. Boughanem, IUP STRI

Création, analyse de questionnaires et d'entretiens pour Windows 2008, 7, 8 et MacOs 10

Tenrox. Guide d intégration Tenrox-Salesforce. Janvier Tenrox. Tous droits réservés.

1/ Présentation de SQL Server :

Gestion du parc informatique matériel et logiciel de l Ensicaen. Rapport de projet. Spécialité Informatique 2 e année. SAKHI Taoufik SIFAOUI Mohammed

La base de données dans ArtemiS SUITE

PHP. Bertrand Estellon. 26 avril Aix-Marseille Université. Bertrand Estellon (AMU) PHP 26 avril / 214

Information utiles. webpage : Google+ : digiusto/

Livre Blanc WebSphere Transcoding Publisher

.NET - Classe de Log

I. Introduction aux fonctions : les fonctions standards

Introduction aux services de domaine Active Directory

Remote Method Invocation (RMI)

WorkflowGen 6.0 Guide de mise à jour

Exemple accessible via une interface Web. Bases de données et systèmes de gestion de bases de données. Généralités. Définitions

Cette application développée en C# va récupérer un certain nombre d informations en ligne fournies par la ville de Paris :

Utiliser Access ou Excel pour gérer vos données

Introduction aux concepts d ez Publish

Jade. Projet Intelligence Artificielle «Devine à quoi je pense»

Traduction des Langages : Le Compilateur Micro Java

Chapitre 5 : Les procédures stockées PL/SQL

Business Intelligence avec SQL Server 2012

Une fois votre tableau excel complet, cliquer sur fichier enregistrer sous type de fichier (menu déroulant) csv (séparateur : point virgule).

Mise en place Active Directory, DNS Mise en place Active directory, DNS sous Windows Serveur 2008 R2

Les structures de données. Rajae El Ouazzani

LES TECHNOLOGIES DU WEB APPLIQUÉES AUX DONNÉES STRUCTURÉES

Soon_AdvancedCache. Module Magento SOON. Rédacteur. Relecture & validation technique. Historique des révisions

A QUOI SERVENT LES BASES DE DONNÉES?

Transcription:

Présentation de Core Data 1 Le modèle Core Data Dans la plupart des applications il est nécessaire d'archiver des objets dans un fichier, et si vous voulez prendre en charge l'annulation de modifications apportées, il faut pouvoir suivre les modifications apportées aux objets. Par exemple, dans une application de gestion des employés, vous avez besoin d'un moyen d'ouvrir un fichier contenant un archivage des objets représentatifs des employés et de leurs services. En utilisant le Framework Core Data, la plupart de ces fonctionnalités vous sont fournies, principalement par l'intermédiaire d'un objet nommé «objet de gestion du contexte», instance de la classe NSManagedObjectContext. Cet objet sert de passerelle vers une collection sous- jacente des objets à gérer et à rendre persistants (pile des objets persistants). Il sert d intermédiaire entre les objets de données de votre application et leur stockage externe, généralement dans une base de données fichier SQLite. 1 Depuis le «Core Data Programming guide» http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/coredata/articles/cdbasics.html Page 1

Le contexte de gestion des objets «Managed Object Context» Apple présente son «contexte de gestion des objets» comme un «bloc- notes intelligent» : lorsque vous chargez des objets issus d'un magasin persistant, cela revient à vous apporter des copies temporaires de ceux- ci sur le bloc- notes où elles forment un graphique d'objet, vous pouvez ensuite modifier ces objets sans que cela ne modifie le magasin persistant, la répercussion des changements dans le magasin n aura lieu qu au moment de la sauvegarde des objets du bloc note. Les objets rendus persistants sont appelés «objets gérés», tous les objets gérés doivent être inscrits avec un «contexte de gestion des objets» ou simplement «contexte». Vous ajoutez ou supprimez des objets gérés au graphique d objet en utilisant le contexte. Le contexte suit les modifications que vous apportez, tant aux attributs des objets individuels que pour les relations entre les objets. Il assure le suivi des modifications, il est donc capable d assurer l annulation/rétablissement de modifications. Il garantit également que si vous modifiez les relations entre les objets, l'intégrité du graphique d'objets sera maintenue. Recherche des objets «Fetch Request» Pour récupérer des données à l'aide d'un contexte, vous devez créer une requête de récupération. Cette requête utilise un objet de la classe NSFetchRequest qui spécifie quelles données vous souhaitez récupérer. Par exemple, «tous les employés» ou «tous les employés du service de commercialisation ordonnés selon le salaire décroissant» (en vue d un «dégraissage» par exemple). Une demande d'extraction comporte généralement trois parties : le nom d'une entité d objet, classe NSEntityDescription, correspondant au type du (ou des) objet(s) recherché(s), un objet «prédicat» optionnel qui spécifie les conditions de recherche, classe NSPredicate, un tableau optionnel de «consignes de rangement» des résultats obtenus, classe NSSortDescriptor. La requête de récupération est transmise à l objet en charge du contexte pour exécution qui retourne le (ou les) objet(s) qui correspond(ent) à la demande (peut- être aucun). Les objets retournés par une extraction sont automatiquement inscrits dans le contexte des objets gérés que vous avez utilisé pour l'extraction. Si un contexte contient déjà un objet géré pour un objet compris dans une requête, alors l'objet géré existant est renvoyé dans les résultats de l'extraction. Page 2

Le coordinateur «Persistent Store Coordinator» Entre les objets chargés et gérés par un contexte et les magasins des objets persistants (la base SQLite), se trouve un coordinateur de magasin persistant «Persistent Store Coordinator». Le coordinateur est conçu pour présenter une façade aux contextes, afin qu'un groupe de magasins persistants apparaisse comme un seul magasin global vis- à- vis des contextes. Un objet contexte peut alors créer un graphe d'objets basé sur l'union de tous les magasins de données connectés au coordinateur. La classe NSPersistentStoreCoordinator représente la fonction de coordinateur. Les magasins persistants «Persistent Stores» Un magasin d objets persistants est associé à un unique fichier de données. Normalement, la seule interaction que vous avez avec ce magasin intervient lorsque vous spécifiez son emplacement au coordinateur. La classe coordinateur NSPersistentStoreCoordinator fournit le support natif de plusieurs formats de fichiers de données : fichier de base SQLite, type NSSQLiteStoreType, fichier binaire, type NSBinaryStoreType, fichier XML, type NSXmlStoreType, fichier en mémoire, type NSInMemoryStoreType. Le modèle permet, si à un moment donné vous décidez de choisir un format de fichier de données différent, de maintenir votre application fonctionnelle sans avoir à modifier son architecture. Remarque importante : bien que SQLite soit pris en charge et utilisé comme mode de stockage le plus courant avec Core Data, le modèle ne peut pas gérer toute base de données SQLite arbitraire. Afin d'utiliser une base de données SQLite, le modèle doit créer et gérer la base de données lui- même. Page 3

Les documents persistants Pour gérer la persistance au sein d une application il est nécessaire de créer et configurer la chaîne des objets nécessaires à celle- ci (NSManagedObjectContext, NSPersistentStoreCoordinator, NSFetchRequest, ). Dans certains cas, cependant, la persistance peut uniquement s appliquer à des fichiers document. La classe NSPersistentDocument est une classe dérivée de NSDocument et complète celle- ci des fonctionnalités de persistance via Core Data. Par défaut, une instance de NSPersistentDocument crée sa propre pile de persistance prête à l'emploi, y compris un contexte objet managé et un magasin unique objet persistant. Il y a en l'espèce un mappage biunivoque entre un document et un magasin de données externes. Par défaut, vous n'avez pas à écrire de code supplémentaire pour gérer la persistance de l'objet. Le modèle des objets gérés «Managed Object Model» Le modèle d'objets gérés est un schéma qui fournit une description des objets gérés, ou entités, utilisées par votre application. Ce modèle est généralement créé graphiquement depuis XCode à l aide d un fichier «Data Model» d extension xcdatamodeld. Les objets persistants ou entités correspondent à des tables contenant des attributs eux mêmes paramétrés. Page 4

Chaque entité représente alors un objet géré persistant, le code des classes associées représentant les objets qui seront chargés via le contexte est généré par XCode, ces classes doivent hériter directement ou non de la classe NSManagedObject. Exemple, enfin Pour cet exemple nous allons considérer une application de gestion d un catalogue de livres. Ce catalogue simplifié fera appel à des objets Livre, Editeur et Auteur. Ces objets devront bien entendu être persistants. On considère pour cet exemple : qu à un livre est lié un unique auteur et un unique éditeur, qu un auteur peut avoir écrit un nombre non limité de livres, qu un éditeur peut avoir édité un nombre non limité de livres. La première chose à faire depuis XCode consiste à établir le schéma des objets gérés à l aide de l outil graphique donnant lieu à un fichier de modèle d extension xcdatamodeld. La vue suivante représente le schéma de notre exemple : La définition des entités quant à leurs attributs et types associés ainsi que les relations entre entités : Page 5

Et le détail de la configuration d une relation, en l occurrence la relation «livrepublie» : Une fois le modèle de données établi, il suffit de sélectionner le menu Editor- >Create NSManagedObject SubClass pour faire générer les classes associées aux entités du modèles. Ces classes nous serviront à charger, modifier, sauvegarder les données via un contexte qui reste à créer. L exemple ci- dessous montre le fichier Auteur.h généré, modèle de l entité ou objet géré «Auteur» qui hérite de la classe NSManagedObject. #import <Foundation/Foundation.h> #import <CoreData/CoreData.h> @class Livre; @interface Auteur : NSManagedObject @property (nonatomic, retain) NSString * auteurnom; @property (nonatomic, retain) NSString * auteuruniqueid; @property (nonatomic, retain) NSSet *editeurdulivre; @end @interface Auteur (CoreDataGeneratedAccessors) - (void)addediteurdulivreobject:(livre *)value; - (void)removeediteurdulivreobject:(livre *)value; - (void)addediteurdulivre:(nsset *)values; - (void)removeediteurdulivre:(nsset *)values; @end On remarquera les propriétés associées aux attributs d un livre et les méthodes permettant d ajouter/supprimer un livre et un éditeur du livre. La sauvegarde des données se fera dans un magasin persistant du type SQLite et le fichier correspondant sera, pour cet exemple, nommé MM_DataBase_Livres et sera stocké dans le dossier /Documents de l application. Le modèle de données étant créé, il faut à présent construire le contexte apte à charger les entités. Pour rappel : l objet contexte est du type NSManagedObjectContext, un objet coordinateur de type NSPersistentStoreCoordinator doit servir d interface entre le contexte et le magasin d objets persistants. Page 6

// Déclaration d un objet contexte NSManagedObjectContext* managedobjectcontext; // Méthode retournant le chemin du magasin persistant -(NSURL*)getCoreDataBaseUrl NSURL *url = [[[NSFileManager defaultmanager] URLsForDirectory:NSDocumentDirectory indomains:nsuserdomainmask] lastobject]; NSURL *storedatabasedurl= [url URLByAppendingPathComponent:@"MM_Database_Livres"]; return storedatabasedurl; // Méthode retournant l objet contexte initialize - (NSManagedObjectContext *) managedobjectcontext if(managedobjectcontext == nil) // Lecture du chemin du magasin persistant NSURL *storedatabasedurl = [self getcoredatabaseurl]; NSError *error = nil; // Création du coordinateur a partir du modèle recherché dans // le paquetage de l application NSPersistentStoreCoordinator *persistentstorecoordinator = [[NSPersistentStoreCoordinator alloc] initwithmanagedobjectmodel:[nsmanagedobjectmodel mergedmodelfrombundles:nil]]; // Choix du type de magasin SQLite if (![persistentstorecoordinator addpersistentstorewithtype:nssqlitestoretype configuration:nil URL:storeDatabasedUrl options:nil error:&error]) NSLog(@"Erreur de chargement du magasin SQLite."); // Création du contexte et association au coordinateur managedobjectcontext=[[nsmanagedobjectcontext alloc]init]; [managedobjectcontext setpersistentstorecoordinator:persistentstorecoordinator]; return managedobjectcontext; Le contexte étant créé il ne reste plus qu à utiliser les entités pour lire, modifier, sauvegarder les données. Exemple de création des objets Auteur, Editeur et Livre pour sauvegarde dans le magasin : Auteur *nouvelauteur = (Auteur *) [NSEntityDescription insertnewobjectforentityforname:@"auteur" inmanagedobjectcontext:self.managedobjectcontext]; nouvelauteur.auteurnom = @"M.M.Corporation"; nouvelauteur.auteuruniqueid = @"1"; Editeur *nouvelediteur = (Editeur *) [NSEntityDescription insertnewobjectforentityforname:@"editeur" inmanagedobjectcontext:self.managedobjectcontext]; nouvelediteur.editeurnom = @"@Apple Inc."; nouvelediteur.editeuruniqueid = @"1"; Livre *nouveaulivre1 = (Livre *) [NSEntityDescription Page 7

insertnewobjectforentityforname:@"livre" inmanagedobjectcontext:self.managedobjectcontext]; nouveaulivre1.livreuniqueid = @"1001"; nouveaulivre1.livretitre = @"La persistance des données avec Core Data"; nouveaulivre1.auteurid = @"1"; nouveaulivre1.editeurid = @"1"; if ([self.managedobjectcontext haschanges]) [self.managedobjectcontext save:nil]; Exemple de lecture des objets Auteur, puis les livres et éditeurs associés pour chaque auteur du magasin : Rappel : la recherche dans le magasin nécessite l utilisation de la classe NSFetchRequest. Les auteurs sont rangés dans l ordre alphabétique à l aide d un objet de la classe NSSortDescriptor. NSFetchRequest * request = [[NSFetchRequest alloc] init]; NSEntityDescription *myentityquery = [NSEntityDescription entityforname:@"auteur" inmanagedobjectcontext:[self getappdelegateref].managedobjectcontext]; NSSortDescriptor* sortauteur = [[NSSortDescriptor alloc] initwithkey:@"auteurnom" ascending:yes]; NSArray *sortarray = [[NSArray alloc]initwithobjects:sortauteur, nil]; [request setentity:myentityquery]; [request setsortdescriptors:sortarray]; NSError *error = nil; NSArray *auteurs = [[self getappdelegateref].managedobjectcontext executefetchrequest:request error:&error]; // Selection des auteurs NSInteger nbrauteurs = [auteurs count]; for (int loop = 0; loop < nbrauteurs; loop++) Auteur *auteur = (Auteur *)[auteurs objectatindex:loop]; NSLog(@"Le nom de l'auteur est : %@", auteur.auteurnom); NSLog(@"L'identifiant unique de l'auteur est : %@", auteur.auteuruniqueid); // Recherche des livres de l auteur NSArray *livres = [auteur.editeurdulivre allobjects]; NSInteger nbrlivres = [livres count]; for (int innerloop = 0; innerloop < nbrlivres; innerloop++) Livre *livre = (Livre *)[livres objectatindex:innerloop]; NSLog(@"L'identifiant unique du livre est : %@", livre.livreuniqueid); NSLog(@"Le titre du livre est : %@", livre.livretitre); NSLog(@"L'auteur du livre est : %@", livre.auteurid); NSLog(@"L'éditeur du livre est : %@\n\n", livre.editeurid); if(loop == 0) NSLog(@"########################################################\n\n;"); Page 8

L exemple précédent mais avec un predicat pour la recherche des livres par auteur : // Selection des auteurs NSInteger nbrauteurs = [auteurs count]; for (int loop = 0; loop < nbrauteurs; loop++) Auteur *auteur = (Auteur *)[auteurs objectatindex:loop]; NSLog(@"Le nom de l'auteur est : %@", auteur.auteurnom); NSLog(@"L'identifiant unique de l'auteur est : %@", auteur.auteuruniqueid); // Recherche des livres de l auteur NSEntityDescription *myentityquery = [NSEntityDescription entityforname:@"livre" inmanagedobjectcontext:[self getappdelegateref].managedobjectcontext]; NSPredicate* mypredicatequery = [NSPredicate predicatewithformat:@"auteurid like %@", auteur.auteuruniqueid]; NSSortDescriptor* sorttitre = [[NSSortDescriptor alloc] initwithkey:@"livretitre" ascending:yes]; NSArray *sortarray = [[NSArray alloc]initwithobjects:sorttitre, nil]; [request setentity:myentityquery]; [request setsortdescriptors:sortarray]; [request setpredicate:mypredicatequery]; NSError *error = nil; NSArray *livres = [[self getappdelegateref].managedobjectcontext executefetchrequest:request error:&error]; NSInteger nbrlivres = [livres count]; for (int innerloop = 0; innerloop < nbrlivres; innerloop++) Livre *livre = (Livre *)[livres objectatindex:innerloop]; NSLog(@"L'identifiant unique du livre est : %@", livre.livreuniqueid); NSLog(@"Le titre du livre est : %@", livre.livretitre); NSLog(@"L'auteur du livre est : %@", livre.auteurid); NSLog(@"L'éditeur du livre est : %@\n\n", livre.editeurid); if(loop == 0) NSLog(@"########################################################\n\n;"); Page 9