Extraction facile de données de base avec enregistrement magique

Magical Record, créé par Saul Mora, est une bibliothèque à code source ouvert qui facilite et rend plus élégante l'utilisation de Core Data. La bibliothèque a été inspirée par le modèle d'enregistrement actif que l'on trouve également dans Ruby on Rails. Ce tutoriel va vous apprendre à utiliser Magical Record dans vos propres applications.!

Alors, pourquoi Magical Record? Si vous développez pour iOS ou OS X depuis un certain temps, il est probable que vous ayez eu un avant-goût de Core Data. Cela signifie que vous savez qu'il peut être un peu fastidieux de configurer une pile Core Data et, pour être honnête, travailler avec Core Data peut être un peu complexe, principalement en raison de sa syntaxe détaillée. Par exemple, l'extraction de données à partir d'un magasin persistant est assez détaillée, surtout en comparaison avec la façon dont une application Ruby on Rails gère cette tâche..


Conditions préalables

Bien que Magical Record facilite le travail avec Core Data, il est essentiel que vous compreniez bien les données de base si vous décidez de les utiliser dans un projet. Malgré son nom, Magical Record n’effectue aucune magie qui permette à Core Data de fonctionner différemment. En d'autres termes, si vous rencontrez des problèmes à un moment donné, il est essentiel de comprendre le fonctionnement interne de Core Data afin de pouvoir résoudre tous les problèmes susceptibles de survenir au cours du processus..


Exigences

Depuis l'introduction de Magical Record, les exigences ont été augmentées pour iOS 5.0 (ou supérieur) ou OS X 10.7 (ou supérieur). Il est également intéressant de noter que Magical Record prend en charge ARC dès la première utilisation..


Notes magiques

Le meilleur moyen de vous montrer ce que Magical Record a à offrir est de créer une application utilisant cette superbe bibliothèque. Il vous montrera à quel point il est facile de démarrer avec Magical Record et, en partant de zéro, vous montrera ce qu’il faut faire pour créer un projet avec Core Data et Magical Record. L'application que nous sommes sur le point de créer est une application de prise de notes simple dans laquelle l'utilisateur peut créer, mettre à jour et supprimer des notes - un bon candidat pour Core Data..

Depuis que vous avez lu jusqu'à présent, je suppose que vous connaissez le développement iOS et que vous avez une compréhension de base de Core Data. Dans cet article, je me concentrerai principalement sur l'aspect Core Data de l'application, ce qui signifie que je ne discuterai pas de chaque extrait de code en détail..


Étape 1: Configuration du projet

Commencez par créer un nouveau projet basé sur le Application à vue unique modèle (figure 1) et nommez-le Notes magiques (Figure 2). Définissez la famille d'appareils sur iPhone et activez ARC en cochant la case intitulée Utiliser le comptage automatique des références. Nous n'utiliserons pas de Storyboards ni de tests unitaires dans ce tutoriel..


Étape 2: Ajouter un enregistrement magique

Comme nous allons utiliser Core Data dans ce projet, n'oubliez pas de lier votre projet au cadre Core Data. Puisqu'il s'agit d'un tutoriel plus avancé, je suppose que vous savez déjà comment faire cela..

L'ajout de la bibliothèque Magical Record à votre projet ne nécessite aucune magie. Téléchargez la dernière version de GitHub, ouvrez l'archive et faites glisser le dossier nommé Enregistrement Magique dans votre projet Xcode. Veillez également à copier le contenu du dossier dans votre projet en cochant la case à cocher intitulée Copier des éléments dans le dossier du groupe de destination (si nécessaire) et n'oubliez pas d'ajouter la bibliothèque Magical Record à la cible Magical Notes (figure 3). Une approche alternative pour ajouter Magical Record à votre projet consiste à utiliser CocoaPods.

Pour utiliser Magical Record dans vos classes, nous devons importer un fichier d’en-tête., CoreData + MagicalRecord.h. Cependant, comme nous allons beaucoup utiliser Magical Record dans ce tutoriel, il est bien plus pratique de déplacer cette instruction d'importation vers celle de votre projet. Prefix.pch déposer à la place. Cela garantira que Magical Record est disponible dans toutes les classes de votre projet..

Par défaut, toutes les méthodes Magical Record sont préfixées avec M_. Vous pouvez omettre le M_ préfixe en ajoutant une ligne supplémentaire à votre projet Prefix.pch fichier, #define MR_SHORTHAND. Il est important que vous ajoutiez cette ligne avant d'importer le fichier d'en-tête de Magical Record..

 // // En-tête de préfixe pour tous les fichiers source de la cible 'Notes magiques' dans le projet 'Notes magiques' // #import  #ifndef __IPHONE_4_0 #warning "Ce projet utilise des fonctionnalités uniquement disponibles dans iOS SDK 4.0 et versions ultérieures." #endif #ifdef __OBJC__ #import  #importation  #define MR_SHORTHAND #import "CoreData + MagicalRecord.h" #endif

Étape 3: Créer un modèle de données principal

Avant de configurer la pile de données de base, nous devons créer un modèle de base de données. Le modèle de données de base de ce projet est simple car il ne comprend qu'une seule entité nommée Remarque. le Remarque entité a quatre attributs, rendez-vous amoureux, Titre, corps, et mots clés. Titre, corps et mots-clés sont de type chaîne, alors que la date est de type rendez-vous amoureux.

Commencez par créer un nouveau modèle Core Data et nommez-le. Notes magiques (figure 4). Créer le Remarque entité et ajouter les quatre attributs décrits ci-dessus (figure 5).

Avant de continuer, nous devons créer une coutume NSManagedObject sous-classe pour le Remarque entité. Ceci est important car Magical Record ajoute un certain nombre de méthodes de classe utiles au NSManagedObject classe, ce qui rendra le travail avec le Remarque entité beaucoup plus facile que vous verrez dans quelques minutes. Sélectionnez le Remarque entité dans votre modèle Core Data, créez un nouveau fichier, sélectionnez le Données de base onglet à gauche, et choisissez le Sous-classe NSManagedObject option à droite (figure 6).


Étape 4: Créer la pile de données de base

La configuration d'une pile de données de base représente un peu de travail si vous n'utilisez pas l'un des modèles Xcode fournis. Avec Magical Record, cependant, ce n'est pas le cas. Dirigez-vous vers le application: didFinishLaunchingWithOptions: méthode de votre délégué d'application et ajoutez l'extrait de code suivant.

 [MagicalRecord setupCoreDataStack];

C'est tout ce qu'on peut en dire. Par défaut, le nom du magasin créé par Magical Record est identique au nom de votre application. Cependant, vous pouvez personnaliser le nom du magasin en appelant setupCoreDataStackWithStoreNamed: à la place et en passant le nom du magasin.

En coulisse, Magical Record instanciera un contexte d'objet géré sur le thread principal, ainsi qu'un coordinateur de magasin persistant et un modèle d'objet géré. Comme c'est magique?

Enregistrement: La possibilité de consigner les messages Core Data et les erreurs sur la console est intégrée à Magical Record. Examinez la console après avoir créé et exécuté votre application pour la première fois. Les journaux de la console vous montrent exactement ce que fait Magical Record dans les coulisses.


Étape 5: Poser les fondations

Avant que nous puissions commencer à créer de nouvelles notes, nous devons d’abord faire un travail difficile. Revisitez votre délégué d'application application: didFinishLaunchingWithOptions: méthode et initialiser un contrôleur de navigation avec le contrôleur de vue principal comme contrôleur de vue racine. Jetez un coup d’œil à la mise en œuvre complète de application: didFinishLaunchingWithOptions:.

 - Application (BOOL): application (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Configuration de la pile de données principale [MagicalRecord setupCoreDataStack]; // Initialise View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialisation du contrôleur de navigation UINavigationController * nc = [[UINavigationController alloc]] initWithRootViewController: self.viewController]; // Initialize Window self.window = [[UIWindow alloc]] initWithFrame: [[UIScreen mainScreen]]]]; [self.window setRootViewController: nc]; [self.window makeKeyAndVisible]; retourner OUI; 

Nous allons afficher les notes dans une vue de table. Commencez par ajouter une sortie pour une vue de table dans le fichier d'en-tête du contrôleur de la vue principale. Sélectionnez le fichier XIB du contrôleur de la vue principale et faites glisser un fichier. UITableView exemple dans la vue du contrôleur de vue. N'oubliez pas d'attribuer le Propriétaire du fichier comme la vue de la table la source de données et déléguer. Assurez-vous également de connecter le Propriétaire du fichier vue de la table sortie avec la vue de la table, nous venons d'ajouter à sa vue.

 #importation  @interface MTViewController: UIViewController @property (nonatomic, faible) IBOutlet UITableView * tableView; @fin

Dans le fichier d'implémentation du contrôleur de la vue principale, ajoutez une propriété privée nommée Remarques à l'extension de classe en haut. Assurez-vous que la propriété est de type NSMutableArray. le Remarques La propriété stockera les notes que nous allons chercher dans le magasin de données et servira de source de données pour la vue table..

 #import "MTViewController.h" @interface MTViewController () @property (nonatomic, strong) NSMutableArray * notes; @fin

Dans le contrôleur de vue viewDidLoad méthode, nous définissons la vue en appelant setupView sur le contrôleur de vue principale. Ce n’est rien de plus qu’une méthode d’aide pour conserver le viewDidLoad méthode concise et épurée. Dans setupView, nous ajoutons un bouton modifier et ajouter à la barre de navigation et nous récupérons les notes du magasin de données en invoquant le fetchNotes méthode.

 - (void) viewDidLoad [super viewDidLoad]; // Vue d'installation [auto setupView]; 
 - (void) setupView // Créer un bouton d'édition UIBarButtonItem * editButton = [[UIBarButtonItem alloc]] initWithTitle: @ style "Edit": UIBarButtonItemStyleBordered target: self action: @selector (editNotes :)]; self.navigationItem.leftBarButtonItem = editButton; // Créer un bouton UIBarButtonItem * addButton = [[UIBarButtonItem alloc] initWithTitle: @ "Ajouter" style: UIBarButtonItemStyleBordered cible: auto action: @selector (addNote :)]; self.navigationItem.rightBarButtonItem = addButton; // Fetch Notes [self fetchNotes]; 

Cela pourrait vous surprendre que le fetchNotes méthode n’est qu’une ligne de code. Tout cela grâce à l'enregistrement magique. Extraire les notes du magasin de données est aussi simple qu’appeler Trouver tout sur le Remarque classe. La méthode retourne un tableau d'enregistrements comme prévu. N'oubliez pas l'importation du fichier d'en-tête du Remarque classe en haut du fichier d'implémentation du contrôleur de vue principale.

 - (void) fetchNotes // Récupération de notes self.notes = [NSMutableArray arrayWithArray: [Note findAll]]; 

Le tri des enregistrements est facile et élégant. Oubliez les descripteurs de tri et jetez un coup d’œil à l’implémentation mise à jour de la fetchNotes méthode ci-dessous.

 - (void) fetchNotes // Récupération de notes self.notes = [NSMutableArray arrayWithArray: [Note findAllSortedBy: @ "date" ascending: YES]]; 

le editNotes: méthode est simple. Nous ne faisons que basculer le style d'édition de la vue tableau. Cela devrait être suffisant pour l'instant.

 - (void) editNotes: (id) expéditeur [self.tableView setEditing:! [self.tableView isEditing] animé: YES]; 

le ajouter une note: la méthode reste vide pour le moment.

 - (void) addNote: (id) expéditeur 

Avant de créer et d’exécuter votre application, nous devons implémenter les méthodes requises du protocole de source de données de vue table. Si vous connaissez le développement iOS, cela ne devrait pas être trop difficile. Jetez un coup d'œil aux implémentations des différentes méthodes ci-dessous pour plus de précisions.

 - (NSInteger) tableView: (UITableView *) numéro de la table (numéro de la vue): (NSInteger) section return [compte rendu.notes]]; 
 - (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath statique NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[UITableViewCell alloc]] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; // Configurer la cellule [cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];  // Extraire la note * note = [self.notes objectAtIndex: [rangéeIndexPath]]; // Configure Cell [cell.textLabel setText: [titre de la note]]; [cell.detailTextLabel setText: [note keywords]]; cellule de retour; 
 - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES; 
 - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) publishingStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editorStyle == UITableViewCellEditingStyleDelete) 
 - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath animé: YES]; 

Construire et exécuter votre application.


Étape 6: Création de notes

Lorsque l'utilisateur appuie sur le bouton Ajouter, une vue modale doit apparaître, permettant à l'utilisateur d'ajouter une nouvelle note au magasin de données. Créer un nouveau UIViewController sous-classe et nommez-le MTEditNoteViewController. Comme son nom l'indique, nous allons également utiliser ce contrôleur de vue pour éditer des notes..

Avant de vous diriger vers le fichier XIB du contrôleur de vue, ajoutez trois points de vente au fichier d’en-tête du contrôleur de vue. Les deux premiers points de vente sont des exemples de UITextField pour le titre et les mots-clés de la note. Le troisième point de vente est une instance de UITextView pour le corps de la note.

 #importation  @interface MTEditNoteViewController: UIViewController @property (nonatomic, faible) IBOutlet UITextField * titleField; @property (nonatomic, faible) IBOutlet UITextField * keywordsField; @property (nonatomic, faible) IBOutlet UITextView * bodyView; @fin

La création de l’interface utilisateur du contrôleur de vue de modification de la note ne devrait pas poser trop de problème. Ajouter deux UITextField cas et un UITextView exemple à la vue du contrôleur de vue. Configurez les champs de texte comme vous le souhaitez, par exemple, en leur donnant un texte de substitution. N'oubliez pas de connecter le Propriétaire du fichierpoints de vente avec les champs de texte et la vue texte.

Puisque nous utiliserons le MTEditNoteViewController classe pour l’ajout et la modification de notes, il est important de connaître l’état (ajout ou édition) du contrôleur de vue à tout moment. Il y a plusieurs façons de résoudre ce problème. Une façon consiste à ajouter un privé Remarque propriété du contrôleur de vue, qui est néant si une nouvelle note est créée et définie lors de l'initialisation lors de l'édition d'une note. Dans ce genre de situation, je préfère travailler avec des initialiseurs spécialisés pour éviter toute confusion. C’est aussi ce qui me permet de garder la Remarque propriété privée. En plus du privé Remarque propriété, nous ajoutons également une deuxième propriété privée nommée est éditer, un booléen. La raison de ceci deviendra claire dans quelques minutes. En outre, n'oubliez pas d'importer le fichier d'en-tête du Remarque classe.

 #import "MTEditNoteViewController.h" #import "Note.h" @interface MTEditNoteViewController () @property (nonatomic, strong) Note * note; @property (nonatomic, assign) BOOL isEditing; @fin

Passons en revue les différentes méthodes étape par étape. Tout d'abord, nous voulons nous assurer que nous pouvons ajouter de nouvelles notes au magasin de données sans problèmes. Nous commençons par initWithNibName: bundle: méthode. Le seul changement que nous apportons est la est éditer propriété à NON.

 - (id) initWithNibName: (NSString *) bundle nibNameOrNil: (NSBundle *) nibBundleOrNil self = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; if (self) // Définit l'indicateur self.isEditing = NO;  retourner soi-même; 

Comme nous l'avons vu précédemment, dans le viewDidLoad méthode, nous définissons la vue en appelant un setupView méthode dans laquelle nous créons les boutons annuler et sauvegarder. Notez que nous ne créons le bouton Annuler que si le Remarque propriété est égale à néant. La raison en est que nous présentons le contrôleur de vue de manière modale lors de l'ajout de nouvelles notes, mais nous le plaçons sur une pile de navigation lorsque nous modifions une note. Si la Remarque propriété n'est pas égale à néant, nous peuplons également les champs de texte et la vue texte avec le contenu de la Remarque propriété.

 - (void) viewDidLoad [super viewDidLoad]; // Vue d'installation [auto setupView]; 
 - (void) setupView // Créer un bouton d'annulation si (! self.note) UIBarButtonItem * cancelButton = [[UIBarButtonItem alloc]] initWithTitle: @ style "Cancel": UIBarButtonItemStyleBordered target: self action: self action: @selector (cancel :)); self.navigationItem.leftBarButtonItem = cancelButton;  // Créer un bouton de sauvegarde UIBarButtonItem * saveButton = [[UIBarButtonItem alloc]] initWithTitle: @ "Save" style: UIBarButtonItemStyleBordered cible: self action: @selector (save :)]; self.navigationItem.rightBarButtonItem = saveButton; if (self.note) // Remplir les champs du formulaire [self.titleField setText: [self.note title]]; [self.keywordsField setText: [self.note keywords]]; [self.bodyView setText: [self.note body]]; 

le Annuler: méthode ne devrait pas contenir de surprises.

 - (void) cancel: (id) sender // Dismiss View Controller [selfjetViewControllerAnimated: YES complétion: nil]; 

le enregistrer: La méthode est un peu plus verbeuse, mais ne devrait pas être trop difficile non plus. Nous vérifions d'abord si le contrôleur de vue Remarque la propriété est définie. Si cette option est définie, nous savons qu’une note est en cours d’édition et non créée. Si la Remarque propriété est égale à néant alors nous savons qu'une nouvelle note devrait être créée. Abandonner le contrôleur de vue est un peu délicat, car nous devons le fermer s'il est présenté de manière modale lors de la création d'une note et le retirer de la pile de navigation lorsqu'une note a été modifiée. C’est la raison pour laquelle nous avons créé le est éditer propriété.

 - (void) save: (id) expéditeur if (! self.note) // Créer une note self.note = [Note createEntity]; // Configure Note [self.note setDate: [NSDate date]];  // Configure Note [self.note setTitle: [self.titleField text]]; [self.note setKeywords: [self.keywordsField text]]; [self.note setBody: [self.bodyView text]]; // Enregistrer le contexte d'objet géré [[NSManagedObjectContext defaultContext] saveNestedContexts]; if (self.isEditing) // Contrôleur de vue contextuelle de la pile de navigation [self.navigationController popViewControllerAnimated: YES];  else // Supprime le contrôleur de vue [auto-licenciement ViewControllerAnimated: YES complétion: nil]; 

Comme vous pouvez le constater, la création d’une nouvelle note est une autre solution lorsqu’on utilise Magical Record. Nous remplissons la note avec le contenu des champs de formulaire et sauvegardons le contexte d'objet géré de la note. Récupérer une référence au contexte de l'objet géré est facile avec Magical Record. Il suffit de demander au NSManagedObjectContext classe pour le contexte par défaut. L'enregistrement du contexte est identique à l'enregistrement d'un contexte sans Magical Record. Même si nous enregistrons l'erreur si quelque chose ne va pas, ce n'est pas vraiment nécessaire puisque Magical Record enregistrera toutes les erreurs sur la console..

Il est maintenant temps de modifier le ajouter une note: méthode dans le contrôleur de vue principale. N'oubliez pas d'importer le fichier d'en-tête du MTEditNoteViewController classe.

 - (void) addNote: (id) expéditeur // Initialise le contrôleur d'affichage de la note, Note MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNibName: @; lot "MTEditNoteViewController": [NSBundle mainBundle]]; // Initialisation du contrôleur de navigation UINavigationController * nc = [[UINavigationController alloc]] initWithRootViewController: vc]; // Contrôleur de vue présent [self.navigationController presentViewController: nc animé: YES achèvement: nil]; 

Chaque fois qu'une nouvelle note est ajoutée au magasin de données, nous devons mettre à jour la vue tabulaire pour afficher les modifications. Pour une application de production, une meilleure approche consisterait à observer les changements dans le contexte de l'objet géré. Toutefois, dans cet exemple d'application, nous extrayons les notes du magasin de données et rechargeons la vue tabulaire chaque fois que la vue principale (ré) apparaît. Cela coûte cher et n'est donc pas recommandé si vous envisagez de soumettre votre application à l'App Store. Pour de telles situations, un contrôleur de résultats récupérés est une solution parfaite.

 - (void) viewWillAppear: (BOOL) animated [super viewWillAppear: animated]; // Fetch Notes [self fetchNotes]; // Reload Table View [self.tableView reloadData]; 

Étape 7: Mise à jour des notes

La mise à jour des notes est presque aussi simple que l'ajout de notes. Comme je l'ai mentionné plus tôt, nous allons créer un initialiseur spécialisé pour définir le contrôleur de vue. Remarque propriété. Mettre à jour le fichier d'en-tête du MTEditNoteViewController classe en ajoutant le nouvel initialiseur comme indiqué ci-dessous. N'oubliez pas d'ajouter également une déclaration de classe en aval pour le Remarque classe dans le fichier d'en-tête.

 #importation  @class Note; @interface MTEditNoteViewController: UIViewController @property (nonatomic, faible) IBOutlet UITextField * titleField; @property (nonatomic, faible) IBOutlet UITextField * keywordsField; @property (nonatomic, faible) IBOutlet UITextView * bodyView; - (id) initWithNote: (Note *) note; @fin

L'initialiseur spécialisé n'est pas spécial en fait. Tout ce que nous faisons est de définir le contrôleur de vue Remarque et est éditer propriétés comme vous pouvez le voir ci-dessous.

 - (id) initWithNote: (Note *) note self = [self initWithNibName: @ "MTEditNoteViewController" bundle: [NSBundle mainBundle]]; if (self) // Set Note self.note = note; // Set Flag self.isEditing = YES;  retourner soi-même; 

Avant de construire et d'exécuter l'application une fois de plus, nous devons mettre à jour le contrôleur de la vue principale. tableView: didSelectRowAtIndexPath: méthode. Dans cette méthode, nous récupérons la note correcte, initialisons une instance du MTEditNoteViewController classe, et poussez le contrôleur de vue sur la pile de navigation.

 - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath animé: YES]; // Récupération d'une note * note = [self.notes objectAtIndex: [rangéeIndexPath]]; // Initialise le contrôleur d'affichage de la note modifiée MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNote: note]; // Poussez View Controller sur la pile de navigation [self.navigationController pushViewController: vc animated: YES]; 

Étape 8: Suppression de notes

Pour supprimer la note, nous devons modifier le tableView: commitEditingStyle: forRowAtIndexPath: méthode. Nous récupérons la note, la supprimons de la source de données et du contexte de l'objet géré, puis mettons à jour la vue tabulaire. Comme vous pouvez le constater, supprimer un enregistrement ou une entité du magasin de données est aussi simple que de lui envoyer un message. deleteEntity.

 - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) publishingStyle forRowAtIndexPath: (NSIndexPath *) indexPath if ]; // Supprimer la note de la source de données [self.notes removeObjectAtIndex: [indexPath row]]; // Supprimer l'entité [note deleteEntity]; // Mise à jour de la vue table [tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationFade]; 

Gratter la surface

En construisant Magical Record, nous n'avons fait qu'effleurer la surface. Je tiens à souligner que Magical Record est une bibliothèque robuste et mature, et non pas simplement un amalgame d’une poignée de catégories utiles. Comme je vous l'ai montré, Magical Record rend le travail avec Core Data beaucoup plus simple et moins explicite. Les tâches courantes sont souvent simples. Comparez les extraits de code suivants pour récupérer toutes les notes et les trier par date. Si vous utilisez des données de base, cela produira l'extrait de code suivant..

 NSFetchRequest * fr = [[NSFetchRequest alloc] init]; NSEntityDescription * ed = [NSEntityDescription entityForName: @ "Note" inManagedObjectContext: [NSManagedObjectContext defaultContext]]; [fr setEntity: ed]; NSSortDescriptor * sd = [NSSortDescriptor sortDescriptorWithKey: @ "date" ascending: YES]; [fr setSortDescriptors: @ [sd]]; NSError * error = nil; NSArray * result = [[NSManagedObjectContext defaultContext] executeFetchRequest: fr erreur: & erreur];

En utilisant l'enregistrement magique, cependant, cela ne nécessite qu'une ligne de code.

 NSArray * result = [Note findAllSortedBy: @ "date" croissant: OUI];

Si nous devions ajouter la possibilité de rechercher dans la liste de notes, une approche - bien que non idéale - serait de rechercher dans le magasin de données toutes les notes avec un titre ou un mot clé contenant la requête. En utilisant Magical Record, cela entraînerait la mise en œuvre suivante.

 NSPredicate * predicate1 = [NSPredicate predicateWithFormat: @ "titre contient [cd]% @", requête]; NSPredicate * predicate2 = [NSPredicate predicateWithFormat: @ "les mots clés contiennent [cd]% @", requête]; NSPredicate * predicate = [NSCompoundPredicate ouPredicateWithSubpredicates: @ [predicate1, predicate2]]; NSArray * result = [Note findAllWithPredicate: predicate];

Conclusion

Comme je l'ai dit, Magical Record a beaucoup plus à offrir que ce que je vous ai montré dans ce tutoriel. Depuis la version 2.0, Magical Record peut gérer des contextes imbriqués et prend également en charge les opérations iCloud et threadées. L'objectif principal de ce didacticiel est de vous montrer que les données de base ne doivent pas nécessairement être lourdes et Saul Mora l'illustre avec Magical Record..