Noțiuni de bază cu Core Data Tutorial

acesta este un capitol prescurtat din cartea noastră Core Data by tutoriale, care a fost complet actualizat pentru Swift 4.2 și iOS 12. Acest tutorial este prezentat ca parte a petrecerii noastre de lansare iOS 12 — bucurați-vă!

Bine ați venit la datele de bază!

în acest tutorial, veți scrie prima dvs. aplicație de date de bază. Veți vedea cât de ușor este să începeți cu toate resursele furnizate în Xcode, de la șabloanele de cod de pornire la editorul modelului de date.

vei lovi terenul alergând chiar de la început. Până la sfârșitul tutorialului veți ști cum să:

  • date Model utilizând editorul de modele Xcode
  • adăugați înregistrări noi la datele de bază
  • preluați un set de înregistrări din datele de bază
  • Afișați înregistrările preluate utilizând o vizualizare de tabel.

veți obține, de asemenea, o idee despre ceea ce fac datele de bază în spatele scenei și despre modul în care puteți interacționa cu diferitele piese în mișcare.

Noțiuni de bază

deschideți Xcode și creați un nou proiect iOS bazat pe șablonul aplicației vizualizare unică. Denumiți HitList app și asigurați-vă că datele de bază de utilizare este verificat.

bifarea casetei de utilizare a datelor de bază va determina Xcode să genereze cod de șabloane pentru ceea ce este cunoscut sub numele de NSPersistentContainer în AppDelegate.swift.

NSPersistentContainer constă dintr-un set de obiecte care facilitează salvarea și preluarea informațiilor din datele de bază. În interiorul acestui container este un obiect pentru a gestiona starea de date de bază ca un întreg, un obiect care reprezintă modelul de date, și așa mai departe.

stiva standard funcționează bine pentru majoritatea aplicațiilor, dar în funcție de aplicația dvs. și de cerințele sale de date, puteți personaliza stiva pentru a fi mai eficientă.

notă: Nu toate template-uri Xcode Sub aplicația iOS au opțiunea de a începe cu datele de bază. În Xcode 10, numai aplicația Master-Detail și șabloanele aplicației Single View au caseta de selectare Utilizare Date de bază.

ideea pentru această aplicație eșantion este simplu: nu va fi o vizualizare tabel cu o listă de nume pentru propriul dvs. foarte „hit list”. Veți putea să adăugați nume la această listă și, în cele din urmă, să utilizați datele de bază pentru a vă asigura că datele sunt stocate între sesiuni. Nu tolerăm violența pe acest site, așa că vă puteți gândi la această aplicație ca la o listă de Favorite pentru a urmări și prietenii dvs., desigur!

Faceți clic pe Main.storyboard pentru ao deschide în Interface Builder. Selectați controlerul de vizualizare de pe pânză și încorporați-l în interiorul unui controler de navigare. Din meniul editorului Xcode, selectați încorporare în … controler de navigare de la sută.

Faceți clic pe bara de navigare a controlerului de navigare pentru a o selecta, apoi faceți clic pe preferă titluri mari în inspectorul Atribute. Acest lucru va oferi aplicației eșantion un stil de titlu care se potrivește cu aplicațiile stoc Apple.

apoi, trageți o vizualizare tabel din biblioteca de obiecte în controlerul de vizualizare, apoi redimensionați-o astfel încât să acopere întreaga vizualizare.

dacă nu este deja deschis, Utilizați pictograma situată în colțul din stânga jos al pânzei pentru a deschide conturul documentului Interface Builder.

Ctrl-trageți din vizualizarea tabel din conturul documentului în vizualizarea părinte și selectați constrângerea Spațiu de conducere pentru zona sigură:

faceți acest lucru încă de trei ori, selectând constrângerile care urmăresc spațiul în zona sigură, spațiul de sus în zona sigură și, în final, spațiul de Jos în zona sigură. Adăugarea celor patru constrângeri va face ca vizualizarea tabelului să-și completeze vizualizarea părinte.

apoi, trageți un element de buton de bară și plasați-l pe bara de navigare a controlerului de vizualizare. În cele din urmă, selectați elementul buton bar și schimbați elementul de sistem pentru a adăuga.

pânza dvs. ar trebui să arate similar cu următoarea captură de ecran:

de fiecare dată când atingeți butonul Adăugare, va apărea un controler de alertă care conține un câmp text. De acolo, veți putea introduce numele cuiva în câmpul de text. Atingerea Save va salva numele, va respinge controlerul de alertă și va reîmprospăta vizualizarea tabelului, afișând toate numele pe care le-ați introdus.

dar mai întâi, trebuie să faceți controlerul de vizualizare sursa de date a vizualizării tabelului. În pânză, Ctrl-trageți din vizualizarea tabelului în pictograma controlerului de vizualizare galben de deasupra barei de navigare, așa cum se arată mai jos, și faceți clic pe sursa de date:

în cazul în care vă întrebați, nu este necesar să configurați delegatul vizualizării tabelului, deoarece atingerea celulelor nu va declanșa nicio acțiune. Nu devine mai simplu decât asta!

deschideți editorul asistent apăsând Command-Option-Enter sau selectând butonul din mijloc al setului de instrumente Editor din bara Xcode.

Ctrl-trageți din vizualizarea tabelului pe ViewController.swift în interiorul definiției clasei pentru a crea un IBOutlet.

apoi, denumiți noua proprietate IBOutlet tableView, rezultând următoarea linie:

@IBOutlet weak var tableView: UITableView!

apoi, Ctrl-trageți din butonul Adăugare în ViewController.swift chiar sub definiția viewDidLoad(). De data aceasta, creați o acțiune în loc de o priză, denumind metoda addName, cu un tip UIBarButtonItem:

@IBAction func addName(_ sender: UIBarButtonItem) { }

acum Puteți consulta vizualizarea tabelului și acțiunea elementului butonului bar în cod.

apoi, veți configura modelul pentru vizualizarea tabelului. Adăugați următoarea proprietate la ViewController.swift sub tableView IBOutlet:

var names: = 

names este o matrice mutabilă care deține valori de șir afișate de vizualizarea tabelului. Apoi, înlocuiți implementarea viewDidLoad() cu următoarele:

override func viewDidLoad() { super.viewDidLoad() title = "The List" tableView.register(UITableViewCell.self, forCellReuseIdentifier: "Cell")}

aceasta va seta un titlu pe bara de navigare și va înregistra clasa UITableViewCell cu vizualizarea tabelului.

notă: register(_:forCellReuseIdentifier:) garantează vizualizarea tabelului va returna o celulă de tipul corect atunci când reuteidentifier celulă este furnizat la metoda dequeue.

următor, încă în ViewController.swift, adăugați următoarea extensie UITableViewDataSource sub definiția clasei pentru ViewController:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return names.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = names return cell }}

dacă ați lucrat vreodată cu UITableView, acest cod ar trebui să arate foarte familiar. Mai întâi returnați numărul de rânduri din tabel ca număr de elemente din matricea names.

apoi, tableView(_:cellForRowAt:) dequeues tabel vezi celulele și le populează cu șirul corespunzător din names matrice.

apoi, aveți nevoie de o modalitate de a adăuga nume noi, astfel încât vizualizarea tabelului să le poată afișa. Implementați metoda addName IBAction pe care ați tras-o Ctrl în codul dvs. mai devreme:

// Implement the addName IBAction@IBAction func addName(_ sender: UIBarButtonItem) { let alert = UIAlertController(title: "New Name", message: "Add a new name", preferredStyle: .alert) let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.names.append(nameToSave) self.tableView.reloadData() } let cancelAction = UIAlertAction(title: "Cancel", style: .cancel) alert.addTextField() alert.addAction(saveAction) alert.addAction(cancelAction) present(alert, animated: true)}

de fiecare dată când atingeți butonul Adăugare, această metodă va prezenta un UIAlertController cu un câmp text și două butoane: salvare și Anulare.

Save inserează câmpurile de text textul curent în matricea names apoi reîncarcă vizualizarea tabelului. Deoarece matricea names este modelul care susține vizualizarea tabelului, orice tastați în câmpul text va apărea în vizualizarea tabelului.

în cele din urmă, construiți și rulați aplicația pentru prima dată. Apoi, atingeți butonul Adăugare. Controlerul de alertă va arăta astfel:

adăugați patru sau cinci nume pe listă. Ar trebui să vedeți ceva similar cu mai jos:

vizualizarea tabelului dvs. va afișa datele și matricea dvs. va stoca numele, dar lucrul mare care lipsește aici este persistența. Matricea este în memorie, dar dacă forțați să părăsiți aplicația sau reporniți dispozitivul, lista dvs. de accesări va fi ștearsă. Datele de bază oferă persistență, ceea ce înseamnă că pot stoca date într-o stare mai durabilă, astfel încât să poată supraviețui unei relansări a aplicației sau unei reporniri a dispozitivului.

nu ați adăugat încă niciun element de date de bază, deci nimic nu ar trebui să persiste după ce navigați departe de aplicație. Să testăm asta. Apăsați butonul Acasă dacă utilizați un dispozitiv fizic sau echivalentul (Shift + centimetrul + H) dacă utilizați simulatorul. Acest lucru vă va duce înapoi la grila de aplicații familiară de pe ecranul de pornire:

din ecranul de pornire, atingeți pictograma HitList pentru a readuce aplicația în prim plan. Numele sunt încă pe ecran. Ce s-a întâmplat?

când atingeți butonul Acasă, aplicația aflată în prezent în prim-plan merge în fundal. Când se întâmplă acest lucru, sistemul de operare flash-îngheață totul în prezent în memorie, inclusiv șirurile din matricea de nume. În mod similar, când este timpul să vă treziți și să reveniți în prim-plan, sistemul de operare restabilește ceea ce era în memorie ca și cum nu ați fi plecat niciodată.

Apple a introdus aceste progrese în multitasking înapoi în iOS 4. Acestea creează o experiență perfectă pentru utilizatorii iOS, dar adaugă un rid definiției persistenței pentru dezvoltatorii iOS. Sunt numele într-adevăr persistat?

nu, nu chiar. Dacă ați fi ucis complet aplicația în comutatorul rapid de aplicații sau ați fi oprit telefonul, aceste nume ar fi dispărut. Puteți verifica și acest lucru. Cu aplicația în prim-plan, introduceți comutatorul rapid de aplicații. Puteți face acest lucru atingând dublu butonul Acasă dacă dispozitivul dvs. are unul sau trăgând încet în sus din partea de jos a ecranului dacă sunteți pe un iPhone X.

de aici, trageți instantaneu aplicația HitList în sus pentru a termina aplicația. Dacă lucrați la un iPhone X, trebuie să apăsați lung instantaneul aplicației până când apare un buton roșu de ștergere în partea dreaptă sus.

după ce eliminați aplicația din App switcher, nu ar trebui să existe nici o urmă de HitList în memorie de viață (nici un joc de cuvinte destinate). Verificați dacă Numele au dispărut revenind la ecranul de pornire și atingând pictograma HitList pentru a declanșa o nouă lansare.

diferența dintre înghețarea flash și persistență poate fi evidentă dacă ați lucrat cu iOS de ceva timp și sunteți familiarizați cu modul în care funcționează multitasking-ul. În mintea unui utilizator, cu toate acestea, nu există nici o diferență. Utilizatorului nu-i pasă de ce numele sunt încă acolo, dacă aplicația a intrat în fundal și s-a întors sau pentru că aplicația le-a salvat și le-a reîncărcat. Tot ce contează este numele sunt încă acolo atunci când aplicația se întoarce!

deci, adevăratul test al persistenței este dacă datele dvs. sunt încă acolo după lansarea unei noi aplicații.

modelarea datelor dvs.

acum știți cum să verificați persistența, vă puteți scufunda în datele de bază. Scopul dvs. pentru aplicația HitList este simplu: persistați numele pe care le introduceți, astfel încât acestea să fie disponibile pentru vizualizare după lansarea unei noi aplicații.

până în acest moment, ați folosit șiruri Swift vechi simple pentru a stoca numele în memorie. În această secțiune, veți înlocui aceste șiruri cu obiecte de date de bază.

primul pas este crearea unui model de obiect gestionat, care descrie modul în care datele de bază reprezintă datele de pe disc.

în mod implicit, datele de bază utilizează o bază de date SQLite ca magazin persistent, astfel încât să vă puteți gândi la modelul de date ca schema bazei de date.

Notă: veți întâlni cuvântul gestionat destul de puțin atunci când aveți de-a face cu datele de bază. Dacă vedeți „gestionat” în numele unei clase, cum ar fi în NSManagedObjectContext, este posibil să aveți de-a face cu o clasă de date de bază. „Gestionat” se referă la gestionarea datelor de bază a ciclului de viață al obiectelor de date de bază.

cu toate acestea, nu presupuneți că toate clasele de date de bază conțin cuvântul „gestionat”. Pentru o listă cuprinzătoare de clase de date de bază, consultați referința cadrului de date de bază din browserul de documentație.

de când ați ales să utilizați datele de bază, Xcode a creat automat un fișier Model de date pentru dvs. și l-a numit HitList.xcdatamodeld.

Deschide Lista De Hit-Uri.xcdatamodeld. După cum puteți vedea, Xcode are un editor puternic de modele de date:

editorul modelului de date are o mulțime de funcții pe care le puteți explora mai târziu. Deocamdată, să ne concentrăm pe crearea unei singure entități de date de bază.

Faceți clic pe Adăugare entitate din stânga jos pentru a crea o entitate nouă. Faceți dublu clic pe noua entitate și schimbați-i numele în persoană, astfel:

s-ar putea să vă întrebați de ce editorul de modele folosește termenul Entity. nu ați definit pur și simplu o nouă clasă? După cum veți vedea în scurt timp, Core Data vine cu propriul vocabular. Iată o scurtă trecere în revistă a unor termeni pe care îi veți întâlni în mod obișnuit:

  • o entitate este o definiție de clasă în datele de bază. Exemplul clasic este un Employee sau un Company. Într-o bază de date relațională, o entitate corespunde unui tabel.
  • un atribut este o informație atașată unei anumite entități. De exemplu, o entitate Employee ar putea avea atribute pentru name, position și salaryale angajatului. Într-o bază de date, un atribut corespunde unui anumit câmp dintr-un tabel.
  • o relație este o legătură între mai multe entități. În datele de bază, relațiile dintre două entități sunt numite relații la una, în timp ce cele dintre una și mai multe entități sunt numite relații la multe. De exemplu, un Manager poate avea o relație to-many cu un set de angajați, în timp ce un individ Employee va avea de obicei o relație to-one cu managerul său.
notă: probabil ați observat că entitățile seamănă mult cu clasele. De asemenea, atributele și relațiile sună foarte mult ca proprietăți. Care e diferența? Vă puteți gândi la o entitate de date de bază ca la o definiție de clasă și la obiectul gestionat ca la o instanță a acelei clase.

acum știți ce este un atribut, puteți adăuga un atribut la obiectul Person creat anterior. Încă în HitList.xcdatamodeld, selectați Person în partea stângă și faceți clic pe semnul plus (+) sub atribute.

Setați numele noului atribut la, er, nume și schimbați tipul acestuia în șir:

în datele de bază, un atribut poate fi unul dintre mai multe tipuri de date.

salvarea datelor de bază

deschideți ViewController.swift, adăugați următorul modul de date de bază import sub UIKit import:

import CoreData

acest import este tot ce aveți nevoie pentru a începe să utilizați API-ul Core Data din codul dvs.

apoi, înlocuiți definiția proprietății names cu următoarele:

var people: = 

veți stoca entități Personmai degrabă decât nume de șiruri, astfel încât să redenumiți matricea care servește ca model de date al vizualizării tabelului la people. Acum deține instanțe de NSManagedObject mai degrabă decât șiruri simple.

NSManagedObject reprezintă un singur obiect stocat în datele de bază; trebuie să-l utilizați pentru a crea, edita, salva și șterge din stocarea persistentă a datelor de bază. După cum veți vedea în scurt timp, NSManagedObject este un schimbător de formă. Poate lua forma oricărei entități din modelul dvs. de date, însușindu-și atributele și relațiile pe care le-ați definit.

deoarece modificați modelul vizualizării tabelului, trebuie să înlocuiți și ambele metode de sursă de date implementate anterior. Înlocuiți extensia UITableViewDataSource cu următoarele:

// MARK: - UITableViewDataSourceextension ViewController: UITableViewDataSource { func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return people.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let person = people let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) cell.textLabel?.text = person.value(forKeyPath: "name") as? String return cell }}

cea mai semnificativă modificare a acestor metode are loc în tableView(_:cellForRowAt:). În loc să potriviți celulele cu șirul corespunzător din matricea modelului, acum potriviți celulele cu NSManagedObjectcorespunzător.

observați cum luați atributul name din NSManagedObject. Se întâmplă aici:

cell.textLabel?.text = person.value(forKeyPath: "name") as? String

de ce trebuie să faci asta? După cum se dovedește, NSManagedObject nu știe despre atributul name pe care l-ați definit în modelul dvs. de date, deci nu există nicio modalitate de a-l accesa direct cu o proprietate. Singurul mod în care datele de bază oferă citirea valorii este codarea valorii cheie, denumită în mod obișnuit KVC.

notă: KVC este un mecanism de bază pentru accesarea proprietăților unui obiect folosind indirect șiruri de caractere. În acest caz, KVC face ca NSMangedObject să se comporte oarecum ca un dicționar în timpul rulării.

codificarea valorii cheii este disponibilă pentru toate clasele care moștenesc de la NSObject, inclusiv NSManagedObject. Nu puteți accesa proprietăți utilizând KVC pe un obiect Swift care nu coboară de la NSObject.

apoi, găsiți addName(_:) și înlocuiți save UIAlertAction cu următoarele:

let saveAction = UIAlertAction(title: "Save", style: .default) { action in guard let textField = alert.textFields?.first, let nameToSave = textField.text else { return } self.save(name: nameToSave) self.tableView.reloadData()}

aceasta preia textul din câmpul text și îl transmite unei noi metode numite save(name:). Xcode se plânge pentru că save(name:) nu există încă. Adăugați-l mai jos addName(_:):

func save(name: String) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } // 1 let managedContext = appDelegate.persistentContainer.viewContext // 2 let entity = NSEntityDescription.entity(forEntityName: "Person", in: managedContext)! let person = NSManagedObject(entity: entity, insertInto: managedContext) // 3 person.setValue(name, forKeyPath: "name") // 4 do { try managedContext.save() people.append(person) } catch let error as NSError { print("Could not save. \(error), \(error.userInfo)") }}

acest lucru este în cazul în care datele de bază lovituri în! Iată ce face codul:

  1. înainte de a putea salva sau prelua ceva din depozitul de date de bază, trebuie mai întâi să puneți mâna pe un NSManagedObjectContext. Puteți considera un context obiect gestionat ca un „scratchpad” în memorie pentru lucrul cu obiecte gestionate.

    gândiți-vă la salvarea unui nou obiect gestionat la datele de bază ca la un proces în doi pași: mai întâi, introduceți un nou obiect gestionat într-un context de obiect gestionat; odată ce sunteți mulțumit, „comiteți” modificările din contextul obiectului gestionat pentru a-l salva pe disc.

    Xcode a generat deja un context obiect gestionat ca parte a șablonului noului proiect. Amintiți-vă, acest lucru se întâmplă numai dacă bifați caseta de selectare Utilizare Date de bază la început. Acest context obiect gestionat implicit trăiește ca o proprietate a NSPersistentContainer în delegatul aplicației. Pentru a-l accesa, veți obține mai întâi o referință la delegatul aplicației.

  2. creați un nou obiect gestionat și introduceți-l în contextul obiect gestionat. Puteți face acest lucru într-un singur pas cu metoda statică NSManagedObject: entity(forEntityName:in:).

    s-ar putea să vă întrebați despre ce este vorba despre un NSEntityDescription. Reamintim mai devreme, NSManagedObject a fost numită o clasă de schimbare a formei, deoarece poate reprezenta orice entitate. O descriere a entității este piesa care leagă definiția entității din modelul dvs. de date cu o instanță de NSManagedObject în timpul rulării.

  1. cu un NSManagedObject în mână, setați name atribut folosind codificare cheie-valoare. Trebuie să scrieți tasta KVC (name în acest caz) exact așa cum apare în modelul dvs. de date, în caz contrar, aplicația dvs. se va bloca în timpul rulării.
  2. vă angajați modificările la person și salvați pe disc apelând save în contextul obiectului gestionat. Notă save poate arunca o eroare, motiv pentru care o numiți folosind cuvântul cheie try într-un bloc do-catch. În cele din urmă, introduceți noul obiect gestionat în matricea people, astfel încât să apară atunci când vizualizarea tabelului se reîncarcă.

asta e un pic mai complicat decât folosind o serie de siruri de caractere, dar nu prea rău. O parte din Codul De aici, cum ar fi obținerea contextului și entității obiectului gestionat, ar putea fi făcută o singură dată în propriul init() sau viewDidLoad(), apoi reutilizate mai târziu. Pentru simplitate, faci totul în aceeași metodă.

Construiți și rulați aplicația și adăugați câteva nume la vizualizarea tabelului:

dacă numele sunt de fapt stocate în datele de bază, Aplicația HitList ar trebui să treacă testul de persistență. Cu aplicația în prim-plan, accesați comutatorul rapid de aplicații și apoi terminați-l.

din Springboard, atingeți aplicația HitList pentru a declanșa o nouă lansare. Stai, ce s-a întâmplat? Vizualizarea tabelului este goală:

ați salvat datele de bază, dar după o lansare nouă a aplicației, matricea people este goală! Asta pentru că datele stau pe disc care vă așteaptă, dar nu le arătați încă.

preluarea datelor de bază

pentru a obține date din magazinul dvs. persistent în contextul obiectului gestionat, trebuie să îl preluați. Deschideți ViewController.swift și adăugați următoarele mai jos viewDidLoad():

override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) //1 guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext //2 let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: "Person") //3 do { people = try managedContext.fetch(fetchRequest) } catch let error as NSError { print("Could not fetch. \(error), \(error.userInfo)") }}

pas cu pas, acesta este ceea ce face codul:

  1. înainte de a putea face ceva cu datele de bază, aveți nevoie de un context obiect gestionat. Preluarea nu este diferită! Ca și înainte, trageți delegatul aplicației și luați o referință la containerul său persistent pentru a pune mâna pe NSManagedObjectContext.
  2. după cum sugerează și numele, NSFetchRequest este clasa responsabilă pentru preluarea datelor de bază. Cererile de preluare sunt atât puternice, cât și flexibile. Puteți utiliza cererile de preluare pentru a prelua un set de obiecte care îndeplinesc criteriile furnizate (adică. dă-mi toți angajații care trăiesc în Wisconsin și au fost cu compania cel puțin trei ani), valori individuale (adică dă-mi cel mai lung nume din Baza de date) și multe altele.

    cererile de preluare au mai multe calificări utilizate pentru a rafina setul de rezultate returnate. Pentru moment, ar trebui să știți NSEntityDescription este unul dintre aceste calificări necesare.

    setarea proprietății entity a unei cereri de preluare sau, alternativ, inițializarea acesteia cu init(entityName:), preia toate obiectele unei anumite entități. Aceasta este ceea ce faceți aici pentru a prelua toate entitățile Person. De asemenea, nota NSFetchRequest este un tip generic. Această utilizare a medicamentelor generice specifică tipul de returnare așteptat al unei cereri de preluare, în acest caz NSManagedObject.

  3. predați cererea de preluare către contextul obiectului gestionat pentru a face ridicarea grea. fetch(_:) returnează o serie de obiecte gestionate care îndeplinesc criteriile specificate de cererea de preluare.

notă: la fel ca save(), fetch(_:) poate arunca și o eroare, deci trebuie să o utilizați într-un bloc do. Dacă a apărut o eroare în timpul preluării, puteți inspecta eroarea din interiorul blocului catch și puteți răspunde corespunzător.

Construiți și rulați aplicația. Imediat, ar trebui să vedeți lista de nume pe care le-ați adăugat mai devreme:

grozav! S-au întors din morți (joc de cuvinte intenționat). Adăugați câteva nume în listă și reporniți aplicația pentru a verifica dacă salvarea și preluarea funcționează. Scurt de a șterge aplicația, resetarea Simulator sau aruncat telefonul de pe o clădire înaltă, numele vor apărea în vizualizarea de masă, indiferent de ce.

Notă: au existat câteva margini aspre în această aplicație eșantion: a trebuit să obțineți contextul obiectului gestionat de la delegatul aplicației de fiecare dată și ați folosit KVC pentru a accesa atributele unei entități, mai degrabă decât un stil de obiect mai natural person.name.

puncte cheie

  • datele de bază oferă persistență pe disc, ceea ce înseamnă că datele dvs. vor fi accesibile chiar și după terminarea aplicației sau închiderea dispozitivului. Acest lucru este diferit de persistența în memorie, care vă va salva datele numai atâta timp cât aplicația dvs. este în memorie, fie în prim-plan, fie în fundal.
  • Xcode vine cu un editor puternic model de date, pe care le puteți utiliza pentru a crea modelul de obiect gestionat.
  • un model de obiect gestionat este alcătuit din entități, atribute și Relații
  • o entitate este o definiție de clasă în datele de bază.
  • un atribut este o informație atașată unei entități.
  • o relație este o legătură între mai multe entități.
  • un NSManagedObject este o reprezentare în timp de execuție a unei entități de date de bază. Puteți citi și scrie atributele sale folosind codificare cheie-valoare.
  • aveți nevoie de o NSManagedObjectContext la save() sau fetch(_:) date către și de la datele de bază.

unde să mergem de aici?

puteți descărca proiectul finalizat pentru acest tutorial folosind butoanele „descărcați materiale” din partea de sus sau de jos a acestui tutorial.

în acest tutorial, ați experimentat deja mai multe concepte fundamentale de date de bază: Modele de date, entități, atribute, obiecte gestionate, contexte de obiecte gestionate și cereri de preluare.

dacă ți-a plăcut ceea ce ai învățat în acest tutorial, de ce să nu verifici datele de bază complete după cartea tutoriale, disponibilă în magazinul nostru?

iată un gust din ceea ce este în carte:

1. Capitolul 1, prima dvs. aplicație de date de bază: veți face clic pe Fișier Nou proiect nou și veți scrie o aplicație de date de bază de la zero! Acest capitol acoperă elementele de bază ale configurării modelului dvs. de date și apoi adăugarea și preluarea înregistrărilor.

2. Capitolul 2, NSManagedObject subclase: NSManagedObject este clasa de bază de stocare a datelor de bază grafice obiect de date. Acest capitol vă va învăța cum vă personalizați propriile subclase de obiecte gestionate pentru a stoca și valida date.

3. Capitolul 3, stiva de date de bază: sub capotă, datele de bază sunt alcătuite din mai multe părți care lucrează împreună. În acest capitol, veți afla despre modul în care aceste părți se potrivesc împreună și vă veți îndepărta de șablonul starter Xcode pentru a vă construi propriul sistem personalizabil.

4. Capitolul 4, preluarea intermediară: aplicațiile dvs. vor prelua date tot timpul, iar datele de bază oferă multe opțiuni pentru a vă obține datele în mod eficient. Acest capitol acoperă cereri de preluare mai avansate, predicate, sortare și preluare asincronă.

5. Capitolul 5, NSFetchedResultsController: vizualizările tabelului se află în centrul multor Aplicații iOS, iar Apple dorește să facă ca datele de bază să se joace frumos cu ele! În acest capitol, veți afla cum NSFetchedResultsController vă poate economisi timp și cod atunci când vizualizările tabelului dvs. sunt susținute de date din datele de bază.

6. Capitolul 6, versiuni și migrare: pe măsură ce actualizați și îmbunătățiți aplicația, modelul său de date va trebui aproape sigur să se schimbe. În acest capitol, veți învăța cum să creați mai multe versiuni ale modelului dvs. de date și apoi să migrați utilizatorii înainte, astfel încât să își poată păstra datele existente pe măsură ce fac upgrade.

7. Capitolul 7, teste unitare: testarea este o parte importantă a procesului de dezvoltare și nu ar trebui să lăsați datele de bază din asta! În acest capitol, veți învăța cum să configurați un mediu de testare separat pentru datele de bază și veți vedea exemple despre cum să vă testați modelele.

8. Capitolul 8, măsurarea și creșterea performanței: Nimeni nu s-a plâns vreodată că o aplicație este prea rapidă, deci este important să fii vigilent cu privire la urmărirea performanței. În acest capitol, veți învăța cum să măsurați performanța aplicației dvs. cu diverse instrumente Xcode și apoi să ridicați câteva sfaturi pentru a face față punctelor lente din codul dvs.

9. Capitolul 9, Mai multe contexte de obiecte gestionate: în acest capitol final, veți extinde stiva de date de bază obișnuită pentru a include mai multe contexte de obiecte gestionate. Veți afla cum acest lucru poate îmbunătăți performanța percepută și vă poate ajuta să faceți arhitectura aplicației Mai puțin monolitică și mai compartimentată.

și pentru a ajuta îndulci afacere, ediția digitală a cărții este în vânzare pentru $ 44.99! Dar nu așteptați — acest preț de vânzare este disponibil doar pentru o perioadă limitată de timp.

vorbind de oferte dulci, asigurați-vă că verificați marile premii pe care le oferim anul acesta cu petrecerea de lansare iOS 11, inclusiv peste 9.000 de dolari în cadouri!

pentru a fi eligibil pentru pentru acest epic iOS 12 giveaway, tot ce trebuie să faceți este să lăsați un comentariu la postarea inițială de lansare, anunțându — ne ce carte sau curs este preferatul dvs. pe această listă-sau ce carte sau curs viitoare sunteți cel mai încântat!

sperăm să vă bucurați de această actualizare, și Stay tuned pentru mai multe versiuni de carte și actualizări!

raywenderlich.com săptămânal

raywenderlich.com buletinul informativ este cel mai simplu mod de a fi la curent cu tot ceea ce trebuie să știți ca dezvoltator mobil.

obțineți un rezumat săptămânal al tutorialelor și cursurilor noastre și primiți un curs gratuit de e-mail aprofundat ca bonus!

evaluare medie

4.6/5

adăugați o evaluare pentru acest conținut

Conectați – vă pentru a adăuga o evaluare

56 evaluări

Lasă un răspuns

Adresa ta de email nu va fi publicată.