Magical Record, gemaakt door Saul Mora, is een open-sourcebibliotheek die werken met Core Data eenvoudiger en eleganter maakt. De bibliotheek is geïnspireerd op het actieve recordpatroon dat ook te vinden is in Ruby on Rails. Deze tutorial leert je Magical Record gebruiken in je eigen apps!
Dus waarom een magische plaat? Als je je al een tijdje aan het ontwikkelen bent voor iOS of OS X, is de kans groot dat je de smaak van Core Data hebt gehad. Dit betekent dat je weet dat het een beetje lastig kan zijn om een Core Data-stack in te stellen en om eerlijk te zijn, werken met Core Data kan een beetje ingewikkeld zijn, vooral vanwege de uitgebreide syntaxis. Het ophalen van gegevens uit een persistente winkel is bijvoorbeeld behoorlijk uitgebreid, vooral wanneer wordt vergeleken met hoe een Ruby on Rails-toepassing deze taak afhandelt..
Hoewel Magical Record het werken met Core Data eenvoudiger maakt, is het van cruciaal belang dat u een goed begrip hebt van Core Data als u besluit om het in een project te gebruiken. Ondanks zijn naam voert Magical Record geen magie achter de schermen uit, waardoor Core Data anders werkt. Met andere woorden, als u op een bepaald moment problemen tegenkomt, is het van cruciaal belang dat u begrijpt hoe Core Data intern werkt, zodat u eventuele problemen kunt oplossen die zich onderweg kunnen voordoen..
Sinds de introductie van Magical Record zijn de vereisten verhoogd naar iOS 5.0 (of hoger) of OS X 10.7 (of hoger). Het is ook vermeldenswaard dat Magical Record ARC out-of-the-box ondersteunt.
De beste manier om te laten zien wat Magical Record te bieden heeft, is om een applicatie te maken die gebruik maakt van deze geweldige bibliotheek. Het zal je laten zien hoe gemakkelijk het is om aan de slag te gaan met Magical Record en door helemaal opnieuw te beginnen, zal het je laten zien wat er is bij het maken van een project met Core Data en Magical Record. De applicatie die we gaan maken, is een eenvoudige app voor het maken van notities, waarin de gebruiker notities kan maken, bijwerken en verwijderen - een goede kandidaat voor Core Data.
Omdat je dit tot nu toe hebt gelezen, ga ik er van uit dat je bekend bent met de ontwikkeling van iOS en een basiskennis hebt van Core Data. In dit artikel zal ik me vooral richten op het Core Data-aspect van de applicatie, wat betekent dat ik niet elk codefragment in detail zal bespreken.
Begin met het maken van een nieuw project op basis van de Toepassing enkele weergave sjabloon (figuur 1) en noem het Magische notities (Figuur 2). Stel de apparaatfamilie in iPhone en schakel ARC in door het selectievakje aan te vinken Gebruik automatische referentietelling. In deze zelfstudie gebruiken we geen storyboards of eenheidstests.
Aangezien we Core Data in dit project zullen gebruiken, vergeet dan niet om uw project te koppelen aan het Core Data-framework. Omdat dit een meer geavanceerde tutorial is, neem ik aan dat je al weet hoe je dit moet doen.
Het toevoegen van de Magical Record-bibliotheek aan uw project vereist geen magie. Download de nieuwste versie van GitHub, open het archief en sleep de map met de naam MagicalRecord in uw Xcode-project. Zorg ervoor dat u ook de inhoud van de map naar uw project kopieert door het selectievakje aan te vinken Kopieer items naar de map van de bestemmingsgroep (indien nodig) en vergeet niet om de Magical Record-bibliotheek toe te voegen aan het Magical Notes-doel (figuur 3). Een alternatieve benadering om Magical Record toe te voegen aan uw project is om CocoaPods te gebruiken.
Om Magical Record in uw klassen te gebruiken, moeten we één headerbestand importeren, CoreData + MagicalRecord.h
. Aangezien we Magical Record echter behoorlijk zullen gebruiken in deze tutorial, is het veel handiger om deze importinstructie naar het project van uw project te verplaatsen. Prefix.pch bestand in plaats daarvan. Dit zorgt ervoor dat Magical Record beschikbaar is in elke klasse van uw project.
Standaard worden alle Magical Record-methoden voorafgegaan door DHR_. U kunt het DHR_ voorvoegsel door een extra regel aan uw project toe te voegen Prefix.pch het dossier, #define MR_SHORTHAND
. Het is belangrijk dat u deze regel toevoegt voordat u het Magical Record-headerbestand importeert.
// // Voorvoegselkop voor alle bronbestanden van het doel 'Magical Notes' in het project 'Magical Notes' // #import#ifndef __IPHONE_4_0 #waarschuwing "Dit project maakt gebruik van functies die alleen beschikbaar zijn in iOS SDK 4.0 en hoger." #endif # ifdef __OBJC__ #import #importeren #define MR_SHORTHAND #import "CoreData + MagicalRecord.h" #endif
Voordat we de Core Data-stack instellen, moeten we een Core Data-model maken. Het Core Data-model voor dit project is eenvoudig omdat het uit slechts één genoemde entiteit bestaat Notitie. De Notitie entiteit heeft vier kenmerken, datum, titel, lichaam, en trefwoorden. Titel, hoofdtekst en trefwoorden zijn van het type draad, terwijl de datum van het type is datum.
Begin met het maken van een nieuw Core Data-model en noem het MagicalNotes (figuur 4). Maak het Notitie entiteit en voeg de vier attributen toe zoals hierboven beschreven (figuur 5).
Voordat we verder gaan, moeten we een aangepaste versie maken NSManagedObject
subklasse voor de Notitie
entiteit. Dit is belangrijk omdat Magical Record een aantal nuttige klassemethoden aan de NSManagedObject
klasse, die het werken met de Notitie entiteit veel eenvoudiger dan u in een paar minuten zult zien. Selecteer de Notitie entiteit in uw Core Data-model, maak een nieuw bestand aan, selecteer de Kerngegevens tab aan de linkerkant en kies de NSManagedObject-subklasse optie aan de rechterkant (figuur 6).
Het opzetten van een Core Data-stack is nogal wat werk als u geen van de meegeleverde Xcode-sjablonen gebruikt. Met Magical Record is dit echter niet het geval. Ga naar de toepassing: didFinishLaunchingWithOptions:
methode van uw aanvraag delegeren en voeg het volgende codefragment toe.
[MagicalRecord setupCoreDataStack];
Dat is alles wat er is. Standaard is de naam van de winkel die Magical Record voor u maakt identiek aan de naam van uw applicatie. U kunt de naam van de winkel echter aanpassen door op te roepen setupCoreDataStackWithStoreNamed:
in plaats daarvan en de naam van de winkel doorgeven.
Achter de schermen plaatst Magical Record een context voor een beheerd object op de hoofdpagina, evenals een permanente winkelcoördinator en een beheerd objectmodel. Hoe magisch is dat?
logging: De mogelijkheid om Core Data-berichten en fouten naar de console te loggen, is ingebouwd in Magical Record. Bekijk de console na het voor de eerste keer bouwen en uitvoeren van uw applicatie. De logs in de console laten je precies zien wat Magical Record achter de schermen doet.
Voordat we nieuwe notities kunnen maken, moeten we eerst wat gegrom doen. Herzie uw toepassingsafgevaardigde opnieuw toepassing: didFinishLaunchingWithOptions:
methode en initialiseer een navigatiecontroller met de hoofdweergavecontroller als de rootview-controller. Bekijk de volledige implementatie van toepassing: didFinishLaunchingWithOptions:
.
- (BOOL) applicatie: (UIApplication *) applicatie didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // Setup Core Data Stack [MagicalRecord setupCoreDataStack]; // Initialize View Controller self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Initialize Navigation Controller UINavigationController * nc = [[UINavigationController alloc] initWithRootViewController: self.viewController]; // Initialize Window self.window = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; [self.window setRootViewController: nc]; [self.window makeKeyAndVisible]; terugkeer JA;
We zullen de notities weergeven in een tabelweergave, dus begin met het toevoegen van een outlet voor een tabelweergave in het headerbestand van de hoofdweergavecontroller. Selecteer het XIB-bestand van de hoofdcontroller en sleep a UITableView
bijvoorbeeld in de weergave van de view controller. Vergeet niet om de. Toe te wijzen Bestand eigenaar zoals de tafelweergave is databron
en delegeren
. Zorg er ook voor dat u de Bestand eigenaar tafelweergave outlet met de tafelweergave die we zojuist aan de weergave hebben toegevoegd.
#importeren@interface MTViewController: UIViewController @property (nonatomic, weak) IBOutlet UITableView * tableView; @einde
Voeg in het implementatiebestand van de mainview-controller een privé-eigenschap toe met de naam aantekeningen naar de klasse-extensie bovenaan. Zorg ervoor dat de eigenschap van het type is NSMutableArray
. De aantekeningen
property slaat de notities op die we ophalen uit de datastore en fungeert als de gegevensbron van de tabelweergave.
#import "MTViewController.h" @interface MTViewController () @property (nonatomic, strong) NSMutableArray * notes; @einde
In de view controller's viewDidLoad
methode, stellen we het beeld op door te bellen setupView
op de hoofdweergavecontroller. Dit is niets meer dan een hulpmethode om de viewDidLoad
methode beknopt en overzichtelijk. In setupView
, we voegen een knop voor bewerken en toevoegen toe aan de navigatiebalk en we halen de notities op uit de gegevensopslag door de fetchNotes
methode.
- (void) viewDidLoad [super viewDidLoad]; // Setup Weergave [zelfinstelling bekijken];
- (ongeldig) setupView // Create Edit Button UIBarButtonItem * editButton = [[UIBarButtonItem alloc] initWithTitle: @ "Bewerk" stijl: UIBarButtonItemStyleBordered target: self action: @selector (editNotes :)]; self.navigationItem.leftBarButtonItem = editButton; // Maak knop Toevoegen UIBarButtonItem * addButton = [[UIBarButtonItem alloc] initWithTitle: @ "Toevoegen" stijl: UIBarButtonItemStyleBordered target: self action: @selector (addNote :)]; self.navigationItem.rightBarButtonItem = addButton; // Fetch Notes [self fetchNotes];
Het zou je kunnen verbazen dat het fetchNotes
methode is slechts één regel code. Dit is allemaal te danken aan Magical Record. Het ophalen van de notities uit de datastore is net zo eenvoudig als bellen vind alle
op de Notitie
klasse. De methode retourneert een array records zoals u zou verwachten. Vergeet het importeren van het header-bestand van de Notitie
klasse boven aan het implementatiebestand van de mainview-controller.
- (void) fetchNotes // Fetch Notes self.notes = [NSMutableArray arrayWithArray: [Note findAll]];
Records sorteren is gemakkelijk en elegant. Vergeet sort descriptors en bekijk de bijgewerkte implementatie van de fetchNotes
methode hieronder.
- (void) fetchNotes // Fetch Notes self.notes = [NSMutableArray arrayWithArray: [Note findAllSortedBy: @ "date" oplopend: YES]];
De editNotes:
methode is eenvoudig. We hoeven alleen maar de bewerkingsstijl van de tabelweergave te wijzigen. Dat zou voor nu voldoende moeten zijn.
- (void) editNotes: (id) afzender [self.tableView setEditing:! [self.tableView is Bezig met bewerken] geanimeerd: YES];
De addNote:
methode blijft voorlopig blanco.
- (void) addNote: (id) afzender
Voordat u uw toepassing kunt bouwen en uitvoeren, moeten we de vereiste methoden voor het databasereferentieprotocol implementeren. Als u bekend bent met de ontwikkeling van iOS, moet dit niet al te moeilijk zijn. Bekijk de implementaties van de verschillende methoden hieronder voor verduidelijking.
- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sectie return [self.notes count];
- (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath static NSString * CellIdentifier = @ "Cell"; UITableViewCell * cell = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; if (cell == nil) cell = [[UITableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; // Configure Cell [cell setAccessoryType: UITableViewCellAccessoryDisclosureIndicator]; // Fetch Note Note * note = [object.notes objectAtIndex: [rij indexPath]]; // Configure Cell [cell.textLabel setText: [note title]]; [cell.detailTextLabel setText: [note keywords]]; terugkeer cel;
- (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES;
- (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle == UITableViewCellEditingStyleDelete)
- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath geanimeerd: YES];
Bouw en run uw applicatie.
Wanneer de gebruiker op de knop Toevoegen tikt, verschijnt er een modale weergave waarmee de gebruiker een nieuwe notitie aan de gegevensopslag kan toevoegen. Maak een nieuw UIViewController
subklasse en noem deze MTEditNoteViewController
. Zoals de naam al aangeeft, zullen we deze view-controller ook gebruiken om notities te bewerken.
Voordat u naar het XIB-bestand van de view-controller gaat, voegt u drie outlets toe aan het header-bestand van de view-controller. De eerste twee verkooppunten zijn voorbeelden van UITextField
voor de titel en de trefwoorden van de notitie. De derde outlet is een instantie van UITextView
voor het lichaam van de notitie.
#importeren@interface MTEditNoteViewController: UIViewController @property (nonatomic, weak) IBOutlet UITextField * titleField; @property (nonatomic, weak) IBOutlet UITextField * keywords Field; @property (nonatomic, weak) IBOutlet UITextView * bodyView; @einde
Het creëren van de gebruikersinterface van de edit note view-controller zou niet zo'n uitdaging moeten zijn. Voeg er twee toe UITextField
exemplaren en één UITextView
bijvoorbeeld naar het aanzicht van de view controller. Configureer de tekstvelden naar wens, bijvoorbeeld door ze een tijdelijke tekst toe te kennen. Vergeet niet om de Bestand eigenaarverkooppunten met de tekstvelden en de tekstweergave.
Omdat we het zullen gebruiken MTEditNoteViewController
klasse voor zowel het toevoegen als bewerken van notities, het is belangrijk dat we op elk moment weten in welke staat (toevoeging of bewerking) de view-controller zich bevindt. Er zijn verschillende manieren om dit probleem op te lossen. Een manier is om een privé toe te voegen Notitie
eigenschap aan de view-controller, dat is nul
als een nieuwe notitie wordt aangemaakt en die wordt ingesteld tijdens de initialisatie wanneer een notitie wordt bewerkt. In situaties zoals deze, werk ik het liefst met gespecialiseerde initializers om verwarring te voorkomen en dit is ook wat mij in staat stelt om de Notitie
eigendom privé. Naast het privé Notitie
eigendom, voegen we ook een tweede privé-eigenschap toe met de naam isEditing
, een boolean. De reden hiervoor zal binnen enkele minuten duidelijk worden. Vergeet ook niet om het header-bestand van de te importeren Notitie
klasse.
#import "MTEditNoteViewController.h" #import "Note.h" @interface MTEditNoteViewController () @property (nonatomic, strong) Opmerking * note; @property (nonatomic, assign) BOOL is Bezig met bewerken; @einde
Laten we de verschillende methoden stap voor stap doorlopen. Ten eerste willen we ervoor zorgen dat we zonder problemen nieuwe opmerkingen aan de gegevensopslag kunnen toevoegen. We beginnen met de initWithNibName: bundel:
methode. De enige verandering die we aanbrengen is het instellen van de isEditing
eigendom aan NEE
.
- (id) initWithNibName: (NSString *) nibNameOrNil-bundel: (NSBundle *) nibBundleOrNil self = [super initWithBibName: nibNameOrNil-bundel: nibBundleOrNil]; if (self) // Vlag instellen self.isEditing = NO; terugkeer zelf;
Zoals we eerder zagen, in de viewDidLoad
methode, we stellen de weergave in door a setupView
methode waarin we de knoppen Annuleren en Opslaan maken. Merk op dat we alleen de knop Annuleren maken als de Notitie
eigendom is gelijk aan nul
. De reden is dat we de view-controller modaal presenteren bij het toevoegen van nieuwe notities, maar we pushen de weergavecontroller op een navigatiestapel wanneer we een notitie bewerken. Als het Notitie
eigendom is niet gelijk aan nul
, we vullen ook de tekstvelden en de tekstweergave in met de inhoud van de Notitie
eigendom.
- (void) viewDidLoad [super viewDidLoad]; // Setup Weergave [zelfinstelling bekijken];
- (ongeldig) setupView // Create Cancel Button if (! self.note) UIBarButtonItem * cancelButton = [[UIBarButtonItem] initWithTitle: @ "Annuleer" stijl: UIBarButtonItemStyleBordered target: self action: @selector (cancel :)]; self.navigationItem.leftBarButtonItem = cancelButton; // Save-knop maken UIBarButtonItem * saveButton = [[UIBarButtonItem alloc] initWithTitle: @ "Save" -stijl: UIBarButtonItemStyleBordered target: self action: @selector (save :)]; self.navigationItem.rightBarButtonItem = saveButton; if (self.note) // Invulformuliervelden [self.titleField setText: [zelf.note titel]]; [self.keywordsField setText: [zelf.note trefwoorden]]; [self.bodyView setText: [body zelf.note]];
De annuleren:
methode mag geen verrassingen bevatten.
- (ongeldig) annuleren: (id) afzender // Afwijzing negeren Controller [zelf negerenViewControllerAnimated: YES completion: nil];
De opslaan:
methode is een beetje meer breedsprakig, maar zou ook niet al te moeilijk moeten zijn. We controleren eerst of de view controller's Notitie
eigendom is ingesteld. Als dit is ingesteld, weten we dat een notitie wordt bewerkt, niet gemaakt. Als het Notitie
eigendom is gelijk aan nul
dan weten we dat een nieuwe notitie moet worden gemaakt. Het negeren van de view controller is een beetje lastig omdat we de view controller moeten sluiten als deze modaal wordt gepresenteerd wanneer een notitie is gemaakt en deze uit de navigatie-stack haalt wanneer een notitie is bewerkt. Dat is de reden dat we de isEditing
eigendom.
- (ongeldig) opslaan: (id) afzender if (! self.note) // Notitie maken self.note = [Note createEntity]; // Configureer Opmerking [self.note setDate: [NSDate date]]; // Configureer Opmerking [self.note setTitle: [self.titleField text]]; [self.note setKeywords: [self.keywordsField text]]; [self.note setBody: [self.bodyView-tekst]]; // Bewaar Beheerd-objectcontext [[NSManagedObjectContext defaultContext] saveNestedContexts]; if (self.isEditing) // Pop View Controller uit Navigation Stack [self.navigationController popViewControllerAnimated: YES]; else // Dismiss View Controller [self dismissViewControllerAnimated: YES completion: nil];
Zoals je kunt zien, is het maken van een nieuwe notitie nog een one-liner bij gebruik van Magical Record. We vullen de notitie in met de inhoud van de formuliervelden en slaan de context van het beheerde object van de notitie op. Het ophalen van een verwijzing naar de context van het beheerde object is eenvoudig met Magical Record. Het enige wat we moeten doen is de vraag stellen NSManagedObjectContext
klasse voor de standaardcontext. Het opslaan van de context is identiek aan het opslaan van een context zonder Magical Record. Hoewel we de foutmelding registreren als er iets fout gaat, is dit niet echt nodig, omdat Magical Record eventuele fouten naar de console voor ons registreert.
Het is nu tijd om de addNote:
methode in de hoofdweergavecontroller. Vergeet niet om het header-bestand van de te importeren MTEditNoteViewController
klasse.
- (void) addNote: (id) afzender // Bewerking initialiseren Notitie Bekijken Controller MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNibName: @ "MTEditNoteViewController" bundel: [NSBundle mainBundle]]; // Navigatiecontroller initialiseren UINavigationController * nc = [[UINavigationController alloc] initWithRootViewController: vc]; // Present View Controller [self.navigationController presentViewController: nc geanimeerd: YES completion: nil];
Wanneer een nieuwe notitie wordt toegevoegd aan de gegevensopslag, moeten we de tabelweergave bijwerken om de wijzigingen weer te geven. Voor een productieapplicatie zou een betere benadering zijn om veranderingen in de context van het beheerde object waar te nemen. In deze voorbeeldtoepassing halen we de notities echter uit de gegevensopslag en laden de tabel opnieuw telkens wanneer de hoofdweergave (opnieuw) wordt weergegeven. Dit is duur en daarom niet aanbevolen als u van plan bent om uw aanvraag in te dienen bij de App Store. Voor situaties zoals deze is een opgehaalde resultatencontroller een perfecte oplossing.
- (void) viewWillAppear: (BOOL) geanimeerde [super viewWillAppear: animated]; // Fetch Notes [self fetchNotes]; // Reload Table View [self.tableView reloadData];
Het bijwerken van notities is bijna net zo eenvoudig als het toevoegen van notities. Zoals ik eerder al zei, zullen we een gespecialiseerde initializer maken om de viewcontroller's in te stellen Notitie
eigendom. Werk het header-bestand van de bij MTEditNoteViewController
klasse door de nieuwe initializer toe te voegen zoals hieronder wordt getoond. Vergeet niet om ook een forward class verklaring toe te voegen voor de Notitie
klasse naar het header-bestand.
#importeren@class Note; @interface MTEditNoteViewController: UIViewController @property (nonatomic, weak) IBOutlet UITextField * titleField; @property (nonatomic, weak) IBOutlet UITextField * keywords Field; @property (nonatomic, weak) IBOutlet UITextView * bodyView; - (id) initWithNote: (Opmerking *) notitie; @einde
De gespecialiseerde initializer is eigenlijk niet speciaal. Alles wat we doen is de weergavecontroller instellen Notitie
en isEditing
eigenschappen zoals u hieronder kunt zien.
- (id) initWithNote: (Opmerking *) opmerking self = [zelf initWithNibName: @ "MTEditNoteViewController" bundel: [NSBundle mainBundle]]; if (self) // Set Note self.note = note; // Vlag instellen self.isEditing = YES; terugkeer zelf;
Voordat we de applicatie nog een keer bouwen en uitvoeren, moeten we de belangrijkste viewcontrollers updaten tableView: didSelectRowAtIndexPath:
methode. In deze methode halen we de juiste noot op, initialiseren een exemplaar van de MTEditNoteViewController
klasse en druk de weergavecontroller op de navigatiestapel.
- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath geanimeerd: YES]; // Fetch Note Note * note = [object.notes objectAtIndex: [rij indexPath]]; // Initialiseren Bewerken Opmerking Bekijken Controller MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNote: note]; // Push View Controller op navigatiestap [self.navigationController pushViewController: vc geanimeerd: YES];
Om een notitie te verwijderen, moeten we de tableView: commitEditingStyle: forRowAtIndexPath:
methode. We halen de notitie op, verwijderen deze uit de gegevensbron en de context van het beheerde object en werken de tabelweergave bij. Zoals u kunt zien, is het verwijderen van een record of entiteit uit de datastore net zo eenvoudig als het verzenden van een bericht van deleteEntity
.
- (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editingStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle == UITableViewCellEditingStyleDelete) // Opmerking ophalen Opmerking * note = [object.not.zelfdr.:indexpad rij] ]; // Opmerking verwijderen uit gegevensbron [self.notes removeObjectAtIndex: [rij indexPath]]; // Entiteit verwijderen [note deleteEntity]; // Tabelweergave bijwerken [tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] withRowAnimation: UITableViewRowAnimationFade];
Door Magical Record te bouwen, hebben we alleen maar het oppervlak bekrast. Ik wil benadrukken dat Magical Record een robuuste, volwassen bibliotheek is en niet slechts een samenvoeging van een handvol nuttige categorieën. Zoals ik je liet zien, maakt Magical Record het werken met Core Data veel eenvoudiger en minder uitgebreid. Veelvoorkomende taken zijn vaak oneliners. Vergelijk de volgende codefragmenten om alle notities op te halen en te sorteren op datum. Met behulp van Core Data zou dit resulteren in het volgende codefragment.
NSFetchRequest * fr = [[NSFetchRequest alloc] init]; NSEntityDescription * ed = [NSEntityDescription entityForName: @ "Note" inManagedObjectContext: [NSManagedObjectContext defaultContext]]; [fr setEntity: ed]; NSSortDescriptor * sd = [NSSortDescriptor sortDescriptorWithKey: @ "date" oplopend: YES]; [fr setSortDescriptors: @ [sd]]; NSError * error = nil; NSArray * result = [[NSManagedObjectContext defaultContext] executeFetchRequest: fr error: & error];
Met behulp van Magische Record, vereist dit echter maar één regel code.
NSArray * result = [Opmerking findAllSortedBy: @ "date" oplopend: JA];
Als we de mogelijkheid zouden toevoegen om in de lijst met notities te zoeken, zou één benadering - hoewel niet ideaal - kunnen zijn om in de gegevensopslag te zoeken naar alle notities met een titel of trefwoord die de query bevatte. Met behulp van Magical Record zou dit resulteren in de volgende implementatie.
NSPredicate * predicate1 = [NSPredicate predicateWithFormat: @ "title bevat [cd]% @", query]; NSPredicate * predicate2 = [NSPredicate predicateWithFormat: @ "keywords bevat [cd]% @", query]; NSPredicate * predicate = [NSCompoundPredicate orPredicateWithSubpredicates: @ [predicate1, predicate2]]; NSArray * result = [Opmerking findAllWithPredicate: predicate];
Zoals ik al zei, heeft Magical Record veel meer te bieden dan wat ik je in deze tutorial heb laten zien. Sinds versie 2.0 kan Magical Record overweg met geneste contexten en biedt het ook ondersteuning voor iCloud- en thread-bewerkingen. Het belangrijkste doel van deze tutorial is om u te laten zien dat Core Data niet omslachtig hoeft te zijn en Saul Mora illustreert dit met Magical Record.