După ce am citit primii pași cu Core Data, ne găsim luminați în modul în care funcționează Core Data și cum ne poate ajuta să dezvoltăm aplicații bogate în date. Cu toate acestea, suprafața a fost doar zgâriată, iar în unele aplicații s-ar putea să vă lăsați să întrebați cum să implementați o anumită funcție de funcționalitate.
În ultimele luni lucram cu Core Data pe un proiect pentru animale de companie. Este o aplicație pentru a trage date dintr-un API pentru servicii la distanță, pentru a stoca datele în Core Data și a le afișa într-o colecție de UITableViews. Pe parcursul dezvoltării, a trecut dintr-un magazin de date bazat pe proprietăți (* shudder *) până acum un magazin de date SQL. După trei reconstrucții complete și multe nopți lungi de depanare, aplicația mea a devenit în cele din urmă un proiect rapid, fără crash și fără scurgeri de memorie. Pentru mine, folosind Core Data mi-a făcut cererea ceea ce a fost intenționată a fi și voi împărtăși multe dintre ceea ce am învățat cu dvs. în acest și în articolele viitoare.
Pentru acest articol, ne vom baza pe aplicația anterioară LapTimer și vom demonstra migrațiile ușoare.
Când dezvoltați o aplicație, aproape că nu veți obține schema corectă prima dată. Deci, Core Data are suport pentru versiunea schemelor și migrarea datelor. Aceasta vă permite să definiți o nouă versiune a schemei de date de bază prin adăugarea unui nou atribut sau entitate în magazin. Apoi definiți modul în care magazinul trebuie să migreze de la o schimbare la alta.
Datele de bază gestionează versiunile schemelor în mod diferit față de alte cadre pe care le-ați fi utilizat în trecut. Când treceți prin dezvoltare și aveți nevoie de un nou atribut sau entitate, procesul de adăugare a acestora este prin crearea unui nou fișier xcdatamodel pentru aplicația dvs. Acest nou fișier va fi versizat, va avea un număr incremental în numele fișierului și va fi diferit de versiunile mai vechi de schemă. În aplicația LapTimer, creați noua versiune a modelului de date. Faceți clic pe fișierul xcdatamodel din aplicația dvs. și apoi navigați la elementul de meniu la: Design> Model de date> Adăugați versiunea modelului.
Veți avea acum un arbore xcdatamodel, părintele fiind un nou fișier xcdatamodel, cu o nouă versiune de schemă notată cu numărul incremental. De asemenea, există o verigă verde împotriva schemei vechi. Aceasta indică schema activă și aplicația pe care o va utiliza. Este important să rețineți că alegerea imediat a versiunii noi poate provoca unele probleme în dezvoltare. Deoarece nu am setat încă o migrare pentru această schemă nouă, dacă am fi făcut noua schemă cea activă atunci Simulatorul sau Dispozitivul va eroare și se va prăbuși la boot. Ca o demonstrație, aruncați o privire la eroarea de mai jos, este obișnuit pentru ceea ce întâlnesc oamenii la prima lor încercare:
În principiu, doar spune "Hei, ai schimbat schema DB activă și am rămas pe o versiune mai veche." Acest lucru împiedică aplicarea de la conflicte și erori, schimbând schema de stocare a datelor de bază. Ea face o comparație pe baza detaliilor schemelor cu care lucrează magazinul. Dacă se dă o nouă versiune de schemă pentru a fi utilizată, dar nu se potrivește cu ceea ce sa configurat sau a migrat, atunci primești această eroare.
Deci, cum să trecem peste asta? Există două opțiuni:
Aceasta este o funcție ușor de utilizat și o caracteristică automată a datelor de bază, dar este limitată doar la migrații simple, motiv pentru care este ușoară. Puteți utiliza această metodă numai dacă modificările se numără printre următoarele:
Notă: Înainte de a ne scufunda, dacă lucrați la proiectul LapTimer, va trebui să construiți proiectul înainte de a începe. Asigurați-vă că xcdatamodel-ul activ este prima versiune cu care a fost construită aplicația. Astfel veți putea vedea munca de migrare.
Ca demonstrație, aplicația LapTimer va avea entitatea evenimentului modificată la Lap. În acest scop, trebuie să actualizăm clasele Event.h și Event.m și orice apariții ale celor din aplicație. Cu o pereche de caracteristici Xcode minunate, acest lucru este nedureros.
Deci, în noua versiune a xcdatamodelului pe care am creat-o mai devreme, voi face schimbarea prin simpla schimbare a valorilor în panoul cu detaliile entității. Acum trebuie să setăm "Identificatorul de redenumire" la eveniment. În același panou, faceți clic pe cheia și introduceți "Eveniment" în câmpul Identifier pentru redenumire, după cum urmează:
Următorul pas este să-i spuneți Core Data că poate efectua migrații ușoare la pornire. Referindu-se la aplicația LapTimer, în fișierul LapTimerAppDelegate.m va trebui să adăugăm un anumit cod la metoda - (NSPersistentStoreCoordinator *) persistentStoreCoordinator:
- (NSPersistentStoreCoordinator *) persistentStoreCoordinator if (persistentStoreCoordinator! = Nil) retur persistentStoreCoordinator; NSURL * storeUrl = [NSURL fișierURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @ "LapTimer.sqlite"]]; NSError * eroare = zero; persistentStoreCoordinator = [[NSPersistentStoreCoordinator alocat] initWithManagedObjectModel: [self managedObjectModel]]; NSDictionary * options = [NSDictionary dicționarWithObjectsAndKeys: [NSNumber numberWithBool: YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool: YES], NSInferMappingModelAutomaticallyOption, nil]; dacă [! [persistentStoreCoordinator addPersistentStoreWithType: configurația NSSQLiteStoreType: URL-ul nul: opțiunea storeUrl: opțiunea eroare: & eroare]) / * Înlocuiți această implementare cu codul pentru a gestiona eroarea în mod corespunzător. abort () determină ca aplicația să genereze un jurnal de eroare și să se termine. Nu trebuie să utilizați această funcție într-o aplicație de expediere, deși poate fi utilă în timpul dezvoltării. Dacă nu este posibilă recuperarea din eroare, afișați un panou de avertizare care instruiește utilizatorul să renunțe la aplicație apăsând butonul Home. Motivele tipice pentru o eroare aici includ: * Stocarea persistentă nu este accesibilă * Schema pentru magazinul persistent este incompatibilă cu modelul obiect gestionat curent Verificați mesajul de eroare pentru a determina ce a fost problema reală. * / NSLog (@ "Eroare nerezolvată% @,% @", eroare, [error userInfo]); abort (); retur persistentStoreCoordinator;
Codul adăugat a fost opțiunile NSDictionary care vor spune Core Data să efectueze migrații automate.
Suntem aproape gata. Următorul pas este să modificați fișierele de clasă pentru entitatea Eveniment pentru a reflecta noul nume. Pentru aceasta, folosim funcția preferată a funcției Xcode, funcția Refactor. După cum este sugerat de nume, această funcție va refactor și va face o Găsire și înlocuire mai avansată pe proiectul dvs. pentru situații ca acestea.
Pentru aceasta, va trebui să deschideți Event.m și să selectați textul "Eveniment" din fișierul respectiv. Apoi mergeți la: Editare> Refactor (Cmd + Shift + J). Sus se va afișa o fereastră cu opțiuni și câmpuri ca imaginea de mai jos. Introduceți în cuvântul Lap în câmpul "Eveniment". Faceți clic pe previzualizare și veți obține rezultatul tuturor modificărilor:
Dacă doriți să consultați ce va face, faceți clic pe unul dintre fișierele din panoul de rezultate și vă va arăta detalii despre ce se va schimba. De asemenea, vom redenumi fișierele Event.h și Event.m pentru noi. Doar pentru a nota, fișierele anterioare xcdatamodel cu clasa specială NSManagedObject înlocuită vor avea o ușoară modificare. Se va schimba numele clasei entității, nu numele entității, astfel încât dacă un dispozitiv trebuie să treacă prin migrare, poate utiliza în continuare clasele de entități NSManagedObject și metodele aferente.
Aplicați lovitura. Asta e. Fiind o măsură de precauție pentru siguranță, va avea și un Snapshot, o altă caracteristică extraordinară a XCode. Deci, dacă totul merge bine, puteți să vă întoarceți la fotografia anterioară, la fel ca Time Machine, dar minus toate stelele și UI galaxie swirly.
Din nefericire, aceasta nu prinde toate schimbările necesare. Mai există încă câteva biți din aplicația LapTimer care menționează evenimentul. Deci, un Găsiți și înlocuiți rapid este în ordine. Mergi la: Editați> Găsiți în proiect. Cu noua fereastră, introduceți Eveniment ca și Find și Lap ca înlocuitor. Debifați "Ignore Case" deoarece nu dorim decât să luăm în considerare capitalizarea strictă a descoperirii. Apoi schimbați meniul dropdown în care este selectat 'Contains' și selectați 'Whole Words'. Aceasta va îngusta descoperirea exact la ceea ce avem nevoie.
Faceți clic pe Căutare. Examinați modificările. Dacă totul a mers bine, efectuați înlocuirea!
Așadar, am creat o nouă versiune a schemei, am făcut unele modificări și acum este timpul să obținem aplicația în noua schemă.
Nimic nu e ciudat aici. Selectați noua schemă pe care doriți să o setați ca fiind activă și navigați la: Design> Model de date> Setarea versiunii curente. Tichetul verde se va muta la noua schemă și este gata de plecare.
Construiți și executați aplicația. Toate ar trebui să fie bine și aplicația ar trebui să se deschidă, să migreze și să ruleze. Nu veți observa această migrare deloc, nici măcar o ieșire de depanare. Dar faptul că codul rulează și lucrează este o dovadă că a migrat.
Deci, aplicația are acum un nume entitate modificat. Acest lucru se poate întâmpla din când în când în dezvoltarea oricărei aplicații. Puteți adăuga proprietăți noi cu această metodă de migrare ușoară cu același proces.
Dacă aveți nevoie să modificați tipul unei proprietăți sau să efectuați modificări mai avansate, atunci va trebui să vă aruncați cu capul în migrarea modelului Object mapping. Aceasta este o metodă mai avansată a ceea ce am efectuat, necesitând configurații și coduri suplimentare. Documentația Apple iOS are o bună performanță prin acest proces de migrare avansată.