Date de bază ușor de preluat cu înregistrări magice

Înregistrarea magică, creată de Saul Mora, este o bibliotecă open-source care face lucrul cu datele de bază mai ușor și mai elegant. Biblioteca a fost inspirată de modelul activ de înregistrare care se regăsește și în Ruby on Rails. Acest tutorial vă va învăța cum să utilizați înregistrarea magică în aplicațiile proprii!

Deci, de ce Magical Record? Dacă ați dezvoltat pentru iOS sau OS X de ceva timp, este posibil să aveți un gust de date core. Aceasta înseamnă că știi că poate fi cam greoaie să configurați o stivă de date de bază și, sincer, lucrul cu datele de bază poate fi un pic complex, în principal datorită sintaxei sale verbose. De exemplu, preluarea datelor dintr-un magazin persistent este destul de detaliată mai ales atunci când este comparată cu modul în care o aplicație Ruby on Rails se ocupă de această sarcină.


Cerințe preliminare

Chiar dacă înregistrarea magică ușurează lucrul cu datele de bază, este important să înțelegeți Core Data dacă decideți să o utilizați într-un proiect. În ciuda numelui său, Magical Record nu efectuează nici o magie în spatele scenei, care face ca datele core să funcționeze diferit. Cu alte cuvinte, dacă întâmpinați probleme la un moment dat, este esențial să înțelegeți modul în care Core Data funcționează intern pentru a putea remedia orice problemă care ar putea apărea de-a lungul drumului.


cerinţe

De la introducerea înregistrării magice, cerințele au crescut la iOS 5.0 (sau mai mare) sau OS X 10.7 (sau mai mare). De asemenea, merită menționat faptul că înregistrarea magică sprijină ARC din cutie.


Notele magice

Cea mai bună modalitate de a vă arăta ceea ce Magical Record are de oferit este de a crea o aplicație care folosește această bibliotecă extraordinară. Vă va arăta cât de ușor este să începeți cu înregistrarea magică și pornind de la zero vă va arăta ce este implicat în crearea unui proiect cu Core Data și înregistrări magice. Aplicația pe care urmează să o creați este o notă simplă care ia în considerare aplicația în care utilizatorul poate crea, actualiza și șterge note - un bun candidat pentru Core Data.

Din moment ce ați citit acest lucru, presupunem că sunteți familiarizați cu dezvoltarea iOS și aveți o înțelegere de bază a datelor de bază. În acest articol, mă voi concentra în principal asupra aspectului Core Data al aplicației, ceea ce înseamnă că nu voi discuta în detaliu fiecare fragment de cod.


Pasul 1: Configurarea proiectului

Începeți prin crearea unui nou proiect bazat pe Vizualizare individuală șablon (figura 1) și denumiți-o Notele magice (figura 2). Setați familia de dispozitive la iPhone și activați ARC, bifând caseta de selectare Utilizați numărarea automată a referințelor. Nu vom folosi Storyboards sau Unitatea de testare în acest tutorial.


Pasul 2: Adăugați înregistrarea magică

Deoarece vom folosi datele de bază în acest proiect, nu uitați să vă conectați proiectul împotriva cadrului Core Data. Deoarece acesta este un tutorial mai avansat, presupun că deja știți cum să faceți acest lucru.

Adăugarea bibliotecii de înregistrări magice la proiectul dvs. nu necesită nici o magie. Descărcați cea mai recentă versiune de la GitHub, deschideți arhiva și trageți folderul numit MagicalRecord în proiectul dvs. Xcode. Asigurați-vă că copiați conținutul folderului în proiect, bifând caseta de selectare Copiați articolele în dosarul grupului de destinație (dacă este necesar) și nu uitați să adăugați biblioteca înregistrării magice la ținta pentru notele magice (figura 3). O abordare alternativă pentru a adăuga înregistrări magice la proiectul dvs. este utilizarea CocoaPods.

Pentru a utiliza înregistrarea magică în clasele dvs., trebuie să importați un fișier antet, CoreData + MagicalRecord.h. Cu toate acestea, deoarece vom folosi înregistrarea magică destul de puțin în acest tutorial, este mult mai convenabil să mutați această declarație de import în proiectul dvs. Prefix.pch fișier în loc. Acest lucru vă va asigura că înregistrarea magică este disponibilă în fiecare clasă a proiectului dvs..

În mod prestabilit, toate metodele Magic Record sunt prefixate cu DL_. Puteți să omiteți DL_ prefix prin adăugarea unei linii suplimentare la proiectul dvs. Prefix.pch fişier, #define MR_SHORTHAND. Este important să adăugați această linie înainte de a importa fișierul cu antet Magical Record.

 // // Antetul prefixului pentru toate fișierele sursă ale țintei "Notele magice" din proiectul "Notes Magice" // #import  #ifndef __IPHONE_4_0 #warning "Acest proiect utilizează funcții disponibile numai în SDK 4.0 și ulterior." #endif #ifdef __OBJC__ #import  #import  #define MR_SHORTHAND #import "CoreData + MagicalRecord.h" #endif

Pasul 3: Creați un model de date de bază

Înainte de a configura stiva de date de bază, trebuie să creăm un model de date de bază. Modelul de date de bază pentru acest proiect este simplu, deoarece constă dintr-o singură entitate numită Notă. Notă entitatea are patru atribute, Data, titlu, corp, și Cuvinte cheie. Titlul, corpul și cuvintele cheie sunt de tip şir, întrucât data este de tip Data.

Începeți prin a crea un nou model Core Data și denumiți-l MagicalNotes (figura 4). Creați Notă entitate și adăugați cele patru atribute așa cum sunt prezentate mai sus (figura 5).

Înainte de a merge mai departe, trebuie să creăm un obicei NSManagedObject subclasa pentru Notă entitate. Acest lucru este important deoarece înregistrarea magică adaugă un număr de metode de clasă utile la NSManagedObject clasa, care va face lucrul cu Notă entitate mult mai ușor, așa cum veți vedea în câteva minute. Selectează Notă entitate din modelul dvs. de date Core, creați un fișier nou, selectați Datele principale din stânga și selectați Subclasa NSManagedObject opțiune din dreapta (figura 6).


Pasul 4: Creați stiva de date de bază

Configurarea unui stack de date de bază este un pic de lucru dacă nu utilizați unul dintre șabloanele Xcode furnizate. Însă cu înregistrarea magică, acest lucru nu este cazul. Mergeți la aplicare: didFinishLaunchingWithOptions: metoda de delegare a aplicației dvs. și adăugați următorul fragment de cod.

 [MagicalRecord setupCoreDataStack];

Cam despre asta e. În mod implicit, numele magazinului pe care îl creează Magical Record este identic cu numele aplicației dvs. Cu toate acestea, puteți personaliza numele magazinului prin invocarea setupCoreDataStackWithStoreNamed: în schimb, trecând numele magazinului.

În spatele scenei, înregistrarea magică va instanția un context de obiecte gestionate pe firul principal, precum și un coordonator de magazin persistent și un model de obiect gestionat. Cât de magic este asta?

Logging: Abilitatea de a înregistra mesaje de bază și erori la consola este încorporată în înregistrarea magică. Aruncați o privire la consola după ce ați construit și rulați aplicația pentru prima dată. Jurnalele din consola vă arată exact ce face Magical Record în spatele scenei.


Pasul 5: Poziționarea fundației

Înainte de a putea începe să creăm noi note, trebuie mai întâi să lucrăm puțin. Revedeți-vă delegatul de aplicații aplicare: didFinishLaunchingWithOptions: și inițializează un controler de navigație cu controlerul de vizualizare principal ca controler de vizualizare rădăcină. Aruncați o privire la implementarea completă a aplicare: didFinishLaunchingWithOptions:.

 - (BOOL): aplicație (UIApplication *) didFinishLaunchingWithOptions: (NSDictionary *) launchOptions // setare stack core data [MagicalRecord setupCoreDataStack]; // Inițializați controlerul de vizualizare self.viewController = [[MTViewController alloc] initWithNibName: @ "MTViewController" bundle: nil]; // Inițializați controlerul de navigație UINavigationController * nc = [[UINavigationController alloc] initWithRootViewController: self.viewController]; // Initialize fereastra self.window = [[UIWindow alocare] initWithFrame: [[UIScreen mainScreen] limite]]; [auto.window setRootViewController: nc]; [auto.window makeKeyAndVisible]; reveniți DA; 

Vom afișa notele într-o vizualizare de tabel, așa că începeți prin adăugarea unei prize pentru o vizualizare de tabel în fișierul antet al controlerului principal. Selectați fișierul XIB al controlerului principal al vizualizării și trageți a UITableView exemplu în vizualizarea controlerului. Nu uitați să alocați Proprietarul dosarului ca tabelul de vizualizare a tabelei sursă de date și delega. De asemenea, asigurați-vă că ați conectat Proprietarul dosarului tabelul de vizualizare cu tabelul pe care tocmai l-am adăugat la vizualizarea sa.

 #import  @interface MTViewController: UIViewController @property (nonatomic, slab) IBOutlet UITableView * tableView; @Sfârșit

În fișierul de implementare al controlerului principal, adăugați o proprietate privată numită notițe la extensia de clasă din partea de sus. Asigurați-vă că proprietatea este de tip NSMutableArray. notițe proprietatea va stoca notele pe care le preluăm din depozitul de date și vom servi ca sursă de date din tabelul de vizualizare.

 #import "MTViewController.h" @interface MTViewController () @property (nonatomic, puternic) NSMutableArray * note; @Sfârșit

În controlerul de vizualizare viewDidLoad metoda, am setat vizualizarea prin apelare setupView pe controlerul principal de vizualizare. Aceasta nu este altceva decât o metodă de ajutor pentru păstrarea viewDidLoad metoda concisă și ordonată. În setupView, adăugăm un buton de modificare și adăugare în bara de navigare și preluăm notele din magazinul de date invocând fetchNotes metodă.

 - (vid) viewDidLoad [super viewDidLoad]; // Afișare configurare [self setupView]; 
 - (void) setupView // Crearea butonului de editare UIBarButtonItem * editButton = [[UIBarButtonItem aliniere] initWithTitle: @ Stilul "Edit": UIBarButtonItemStyleBordered target: self action: @selector (editNotes :); self.navigationItem.leftBarButtonItem = editButton; // Creați butonul de adăugare UIBarButtonItem * addButton = [[UIBarButtonItem alocare] initWithTitle: @ Stilul "Add": UIBarButtonItemStyleFuncția țintă: acțiunea de sine: @selector (addNote :)]; auto.navigationItem.rightBarButtonItem = addButton; // Fetch Notes [self fetchNotes]; 

S-ar putea să te surprindă că fetchNotes metoda este doar o singură linie de cod. Acest lucru este datorat înregistrării magice. Adugarea de note din magazinul de date este la fel de simplă ca și apelarea Găsiți toate pe Notă clasă. Metoda returnează o serie de înregistrări așa cum v-ați aștepta. Nu uitați importul fișierului antet al Notă clasă în partea de sus a fișierului de implementare a controlerului principal.

 - (void) fetchNotes // Fetch note self.notes = [NSMutableArray arrayWithArray: [Notă findAll]]; 

Înregistrările de sortare sunt ușor și elegant. Uita descriptorii de sortare și aruncă o privire la implementarea actualizată a fetchNotes mai jos.

 - (void) fetchNotes // Fetch note self.notes = [NSMutableArray arrayWithArray: [Notă findAllSortedBy: @ "date" ascendentă: YES]]; 

editNotes: metoda este simplă. Tot ce facem este să comutați stilul de editare al vizualizării tabelului. Ar trebui să fie suficient pentru acum.

 - (void) editNotes: (id) expeditor [auto.tableView setEditing:! [self.tableView isEditing] animat: YES]; 

adauga notita: metoda rămâne necompletată pentru moment.

 - (vid) addNote: (id) expeditor 

Înainte de a construi și a rula aplicația, trebuie să implementăm metodele necesare ale protocolului sursă de date pentru tabele. Dacă sunteți familiarizat cu dezvoltarea iOS, acest lucru nu ar trebui să fie prea dificil. Uitați-vă la implementările diferitelor metode de mai jos pentru clarificare.

 - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sectiunea return [numar de sine; note]; 
 - (UITableViewCell *) tableView: (UITableView *) aTableView cellForRowAtIndexPath: (NSIndexPath *) indexPath NSString static * CellIdentifier = @ "Celula"; UITableViewCell * celula = [aTableView dequeueReusableCellWithIdentifier: CellIdentifier]; dacă (celula == zero) cell = [[UITableViewCell alin] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: CellIdentifier]; // Configure Cell [celula setAccessoryType: UITableViewCellAccessoryDisclosureIndicator];  // Fetch Note Notă * note = [auto.notes objectAtIndex: [indexPath row]]; // Configure Cell [cell.textLabel setText: [notă titlu]]; [cell.detailTextLabel setText: [notele cuvinte cheie]]; celule retur; 
 - (BOOL) tableView: (UITableView *) tableView canEditRowAtIndexPath: (NSIndexPath *) indexPath return YES; 
 - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editareStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle == UITableViewCellEditingStyleDelete) 
 - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath animat: YES]; 

Construiți și executați aplicația.


Pasul 6: Crearea de note

Când utilizatorul fixează butonul de adăugare, ar trebui să apară o vizualizare modală care să permită utilizatorului să adauge o notă nouă în memoria de stocare. Creaza un nou UIViewController subclasa și denumiți-o MTEditNoteViewController. După cum indică și numele, vom folosi și acest controler de vizualizare pentru a edita notițele.

Înainte de a vă deplasa la fișierul XIB al controlerului de vizualizare, adăugați trei ieșiri la fișierul antet al controlerului de vizualizare. Primele două puncte de ieșire sunt cazuri de UITextField pentru titlul și cuvintele cheie ale notei. A treia ieșire este un exemplu de UITextView pentru corpul notei.

 #import  @ interfață MTEditNoteViewController: UIViewController @property (nonatomic, slab) IBOutlet UITextField * titleField; @property (nonatomic, slab) IBOutlet UITextField * keywordsField; @property (nonatomic, slab) IBOutlet UITextView * bodyView; @Sfârșit

Crearea interfeței de utilizator a controlorului de vizualizare a notelor de editare nu ar trebui să fie o provocare prea mare. Adăugați două UITextField instanțe și una UITextView exemplu la vizualizarea controlerului de vizualizare. Configurați câmpurile de text după cum doriți, de exemplu, dându-le un text de substituent. Nu uitați să conectați Proprietarul dosaruluicu punctele de text și vizualizarea textului.

Deoarece vom folosi MTEditNoteViewController pentru adăugarea și editarea notelor, este important să știm care este starea (adăugarea sau editarea) controlerului de vizualizare în orice moment. Există câteva modalități de a rezolva această problemă. O modalitate este de a adăuga o privată Notă proprietatea la controlerul de vizualizare, care este zero dacă se creează o notă nouă și care este setată în timpul inițializării atunci când se editează o notă. În astfel de situații, prefer să lucrez cu inițialele specializate pentru a evita confuzia și, de asemenea, acest lucru mi-a permis să păstrez Notă proprietate privată. În plus față de privat Notă proprietate, adăugăm și oa doua proprietate privată numită isEditing, un boolean. Motivul pentru aceasta va deveni clar în câteva minute. De asemenea, nu uitați să importați fișierul antet al Notă clasă.

 #import "MTEditNoteViewController.h" #import "Note.h" @interface MTEditNoteViewController () @property (nonatomic, puternic) Notă * notă; @property (nonatomic, atribuire) BOOL isEditing; @Sfârșit

Să trecem prin diferite metode pas cu pas. În primul rând, dorim să ne asigurăm că putem adăuga noi note la magazinul de date fără probleme. Începem cu initWithNibName: pachet: metodă. Singura schimbare pe care o facem este setarea isEditing proprietate la NU.

 - (id) initWithNibName: (NSString *) pachet nibNameOrNil: (NSBundle *) nibBundleOrNil auto = [super initWithNibName: nibNameOrNil bundle: nibBundleOrNil]; dacă (self) // Set Flag self.isEditing = NO;  întoarce-te; 

După cum am văzut mai devreme, în viewDidLoad metoda, am setat vizualizarea prin invocarea unui setupView metoda în care se creează butoanele de anulare și salvare. Rețineți că vom crea doar butonul de anulare dacă Notă proprietatea este egală cu zero. Motivul este că prezentăm modulul de vizualizare modal când adăugăm noi note, dar împingem controlerul de vizualizare pe o stivă de navigare când editează o notă. În cazul în care Notă proprietatea nu este egală cu zero, de asemenea, vom popula câmpurile text și vizualizarea textului cu conținutul Notă proprietate.

 - (vid) viewDidLoad [super viewDidLoad]; // Afișare configurare [self setupView]; 
 - (void) setupView // Creează butonul de anulare dacă (! self.note) UIBarButtonItem * cancelButton = [[UIBarButtonItem alin] initWithTitle: @ Style "Cancel": UIBarButtonItemStyleBordered target: self action: @selector (cancel :); auto.navigationItem.leftBarButtonItem = cancelButton;  // Crearea butonului de salvare UIBarButtonItem * saveButton = [UIBarButtonItem alin] initWithTitle: @ Stilul "Salvare": UIBarButtonItemStyleTargetul bordered: auto action: @selector (save :)]; auto.navigationItem.rightBarButtonItem = saveButton; dacă (self.note) // Populați câmpurile formularului [self.titleField setText: [self.note title]]; [nume de sine.keywordsFile setText: [keywords self.note]]; [self.bodyView setText: [corp auto.note]]; 

Anulare: metoda nu ar trebui să dețină surprize.

 - (void) anulați: (id) expeditor // Renunțați la vizualizarea controlerului [self dismissViewControllerAnimated: YES completion: nil]; 

Salvați: metoda este un pic mai verbose, dar nici nu ar trebui să fie prea dificilă. Mai întâi verificăm dacă controlerul de vizualizare Notă proprietatea este setată. Dacă este setat atunci știm că o notă este ediată, nu este creată. În cazul în care Notă proprietatea este egală cu zero atunci știm că ar trebui creată o notă nouă. Renunțarea la controlerul de vizualizare este un pic dificilă deoarece trebuie să respingem controlerul de vizualizare dacă este prezentat modal când a fost creată o notă și să fie afișată din stiva de navigare atunci când a fost editată o notă. Acesta este motivul pentru care l-am creat isEditing proprietate.

 - (void) salvați: (id) expeditor if (! self.note) // Creați nota self.note = [Notă creaEntity]; // Configurează nota [self.note setDate: [NSDate date]];  // Configurează nota [self.note setTitle: [auto.titleField text]]; [auto.note setKeywords: [auto.keywordsField text]]; [self.note setBody: [auto.bodyView text]]; // Salvați Contextul Obiectului Gestionat [[NSManagedObjectContext defaultContext] saveNestedContexts]; dacă (self.isEditing) // Controlul vizual al popului din Navigation Stack [self.navigationController popViewControllerAnimated: YES];  altceva // Renunțați la vizualizarea controlerului [self dismissViewControllerAnimated: YES completion: nil]; 

După cum puteți vedea, crearea unei note noi este un alt unic de linie atunci când se utilizează înregistrarea magică. Aplicăm nota cu conținutul câmpurilor de formular și salvăm contextul obiect gestionat al notei. Obținerea unei trimiteri la contextul obiect gestionat este ușor cu înregistrarea magică. Tot ce trebuie să facem este să întrebați NSManagedObjectContext pentru contextul implicit. Salvarea contextului este identică cu salvarea unui context fără înregistrări magice. Chiar dacă vom înregistra eroarea în cazul în care ceva nu merge bine, acest lucru nu este cu adevărat necesar, deoarece Magical Record va înregistra orice erori la consola pentru noi.

Acum este momentul să modificăm adauga notita: metode în controlerul principal de vizualizare. Nu uitați să importați fișierul antet al MTEditNoteViewController clasă.

 - (void) addNote: (id) expeditor // Inițializează editare Vizualizare controler MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNibName: @ pachet "MTEditNoteViewController": [NSBundle mainBundle]; // Initializeaza controlerul de navigatie UINavigationController * nc = [[UINavigationController alloc] initWithRootViewController: vc]; // Controler de vizualizare actual [self.navigationController presentViewController: nc animat: DA terminat: nil]; 

Ori de câte ori o notă nouă este adăugată la depozitul de date, ar trebui să actualizăm vizualizarea tabelului pentru a afișa modificările. Pentru o aplicație de producție, o abordare mai bună ar fi aceea de a observa schimbările în contextul obiectului gestionat. Cu toate acestea, în această aplicație de probă, preluăm notele din memoria de stocare și reîncărcați vizualizarea tabelului de fiecare dată când apare vizualizarea principală (re). Acest lucru este scump și, prin urmare, nu este recomandat dacă intenționați să trimiteți cererea dvs. la App Store. În astfel de situații, un controler de rezultate preluat este o soluție perfectă.

 - (void) viewWillAppear: (BOOL) animat [super vizualWillAppear: animat]; // Fetch Notes [self fetchNotes]; // Reîncarcă tabelul [self.tableView reloadData]; 

Pasul 7: Actualizarea notelor

Actualizarea notelor este aproape la fel de ușoară ca adăugarea de note. După cum am menționat mai devreme, vom crea un inițializator specializat pentru a seta controlerul de vizualizare Notă proprietate. Actualizați fișierul antet al MTEditNoteViewController clasă prin adăugarea noului inițializator după cum se arată mai jos. Nu uitați să adăugați, de asemenea, o declarație de clasă înainte pentru Notă clasă în fișierul antet.

 #import  @ notă de clasă; @ interfață MTEditNoteViewController: UIViewController @property (nonatomic, slab) IBOutlet UITextField * titleField; @property (nonatomic, slab) IBOutlet UITextField * keywordsField; @property (nonatomic, slab) IBOutlet UITextView * bodyView; - (id) initWithNote: (Notă *) Notă; @Sfârșit

Initializatorul specializat nu este de fapt special. Tot ce facem este să setăm controlerul de vizualizare Notă și isEditing cum puteți vedea mai jos.

 - (id) initWithNote: (Notă *) notă self = [auto initWithNibName: @ pachet "MTEditNoteViewController": [NSBundle mainBundle]]; dacă (auto) // Setați nota self.note = notă; // Setați Flag self.isEditing = YES;  întoarce-te; 

Înainte de a construi și rula aplicația încă o dată, trebuie să actualizăm controlerul principal al vizualizării tableView: didSelectRowAtIndexPath: metodă. În această metodă, preluăm nota corectă, inițializăm o instanță a MTEditNoteViewController și împingeți controlerul de vizualizare în stivă de navigație.

 - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath [tableView deselectRowAtIndexPath: indexPath animat: YES]; // Fetch Note Notă * note = [auto.notes objectAtIndex: [indexPath row]]; // Initialize Edit Editoare Note Note MTEditNoteViewController * vc = [[MTEditNoteViewController alloc] initWithNote: nota]; // Push View Controller pe stivă de navigare [self.navigationController pushViewController: vc animat: YES]; 

Pasul 8: Ștergerea notelor

Pentru a șterge nota, trebuie să modificăm tableView: commitEditingStyle: forRowAtIndexPath: metodă. Returnați nota, ștergeți-o din sursa de date și contextul obiect gestionat și actualizați vizualizarea tabelului. După cum puteți vedea, ștergerea unei înregistrări sau a unei entități din depozitul de date este la fel de simplă ca și trimiterea unui mesaj deleteEntity.

 - (void) tableView: (UITableView *) tableView commitEditingStyle: (UITableViewCellEditingStyle) editareStyle forRowAtIndexPath: (NSIndexPath *) indexPath if (editingStyle == UITableViewCellEditingStyleDelete) // Fetch Note Notă * note = [auto.notes objectAtIndex: ]; // Ștergeți nota din sursa de date [auto.notes removeObjectAtIndex: [indexPath row]]; // Ștergeți Entitatea [note deleteEntity]; // Actualizați tabela de vizualizare [tableView deleteRowsAtIndexPaths: [NSArray arrayWithObject: indexPath] cuRowAnimation: UITableViewRowAnimationFade]; 

Scratching Surface

Prin construirea înregistrării magice, am zgâriat numai suprafața. Vreau să subliniez faptul că Recordul Magic este o bibliotecă robustă și matură și nu doar o combinație de câteva categorii utile. După cum v-am arătat, înregistrarea magică face mult mai ușor și mai puțin verbală lucrul cu Core Data. Sarcinile obișnuite sunt de multe ori unic. Comparați următoarele fragmente de cod pentru a prelua toate notele și a le sorta după dată. Utilizând datele de bază, acest lucru ar duce la următorul fragment de cod.

 NSFetchRequest * fr = [[NSFetchRequest alocare] init]; NSEntityDescription * ed = [Entită NSEntityDescriptionForName: @ "Notă" inManagedObjectContext: [NSManagedObjectContext defaultContext]]; [fr setEntity: ed]; NSSortDescriptor * sd = [NSSortDescriptor sortDescriptorWithKey: @ "data" ascendentă: YES]; [fr setSortDescriptori: @ [sd]]; NSError * eroare = zero; NSArray * result = [[NSManagedObjectContext defaultContext] executeFetchRequest: eroare de eroare: & error];

Folosind înregistrarea magică, totuși, acest lucru necesită doar o singură linie de cod.

 NSArray * rezultat = [Notă findAllSortedBy: @ "data" ascendentă: YES];

Dacă adăugăm capacitatea de a căuta în lista de note, o abordare - deși nu este ideală - ar fi căutarea în memoria de date a tuturor notelor cu un titlu sau un cuvânt cheie care conținea interogarea. Folosind înregistrarea magică, acest lucru ar duce la implementarea următoare.

 NSPredicate * predicate1 = [NSPredicate predicateWithFormat: @ "titlu conține [cd]% @", interogare]; NSPredicate * predicate2 = [NSPredicate predicateWithFormat: @ "cuvintele cheie conțin [cd]% @", interogare]; NSPredicate * predicate = [NSCompoundPredicate sauPredicateWithSubpredicates: @ [predicate1, predicate2]]; NSArray * rezultat = [Notă findAllWithPredicate: predicat];

Concluzie

După cum am spus, Recordul Magic are multe de oferit decât ceea ce ți-am arătat în acest tutorial. De la versiunea 2.0, Magical Record se ocupă de contexte imbricate și oferă, de asemenea, suport pentru operațiile iCloud și threaded. Scopul principal al acestui tutorial este să vă arate că datele de bază nu trebuie să fie greoaie, iar Saul Mora ilustrează acest lucru cu înregistrarea magică.

Cod