Datele de bază pentru iPhone primii pași ai dvs.

Datele de bază reprezintă un cadru pe care Apple îl oferă dezvoltatorilor care este descris ca un "schemă de gestionare a graficului obiect și a cadrului de persistență". Ce înseamnă de fapt asta? Cadrul gestionează unde sunt stocate datele, modul în care acestea sunt stocate, cache-ul de date și gestionarea memoriei. A fost portat pe iPhone de pe Mac OS X cu versiunea 3.0 iPhone SDK.

În acest tutorial vă voi îndruma prin procesul de creare a unui proiect cu Core Data și vă va arăta cum să îl folosiți cu un simplu UITableViewController. Va fi o bază de date simplă care va stoca Lap Times și va afișa vremurile și diferențele lor divizate într-o vizualizare UITableView.

De ce să folosiți datele de bază?

Înainte de a începe, este important să înțelegeți de ce ați putea dori să utilizați datele de bază cu SQLite pentru stocarea pe listele de proprietăți, un format XML personalizat sau accesul direct la baza de date SQLite. API-ul Core Data permite dezvoltatorilor să creeze și să utilizeze o bază de date relațională, să efectueze validarea înregistrărilor și să efectueze interogări utilizând condiții fără SQL. În esență, vă permite să interacționați cu SQLite în Obiectiv-C și să nu vă faceți griji cu privire la conexiunile sau gestionarea schemei bazei de date, iar cele mai multe dintre aceste caracteristici sunt familiare persoanelor care au utilizat tehnologii de cartografiere obiect-relațională (ORM), cum ar fi cele implementate în Ruby pe Rails, CakePHP, LINQ sau alte biblioteci și cadre care permit accesul abstract la baza de date. Principalul beneficiu al acestei abordări este acela că elimină timpul de dezvoltare care este altfel necesar pentru a scrie interogări SQL complexe și pentru a gestiona manual SQL și ieșirea acelor operații.

Crearea unui nou proiect iPhone cu date de bază

Aplicația de exemplu pe care o vom construi astăzi este un simplu cronometru. Va crea o nouă înregistrare în magazinul de date Core pentru fiecare tură pe care o facem. UITableView va afișa apoi diferența dintre turneele curente și ultime.

Pentru a începe, vom deschide XCode și vom crea un nou proiect. Denumiți ceea ce doriți, l-am numit "LapTimer". Vom crea o "aplicație bazată pe ferestre" din selecția noului șablon de proiect. Asigurați-vă că este bifată opțiunea "Utilizați datele de bază pentru stocare".

Proiectul trebuie să fie familiar cu ceea ce ați mai văzut înainte dacă ați dezvoltat anterior aplicații iPhone.

Configurarea structurii principale de date

Nu există prea multe setări de făcut, deoarece opțiunea "Utilizați datele de bază pentru stocare" din șablonul "Aplicație bazată pe ferestre" a setat automat câteva variabile importante și a creat fișiere în proiect pentru noi.

Fișierul LapTimer.xcdatamodel este locul în care vom defini schema pentru baza de date SQLite. Cadrul Core Data a fost adăugat, de asemenea, la proiect pentru a include fișierele pentru accesul API. Celelalte modificări se fac în fișierele de aplicații implicite. În mod special, fișierele de delegate ale aplicațiilor au metodele de a configura baza de date Core în aplicația noastră și de ao referi la copilul UIViewControllers.

Ceea ce ne interesează în acest moment este fișierul LapTimer.xcdatamodel sub "Resurse". Acest fișier vă oferă o hartă vizuală a schemei dvs. care prezintă entități și atribute.

Există câțiva termeni și expresii diferite utilizate în datele de bază care pot fi corelate în mod liber cu numele obișnuit al bazei de date, dar acestea nu sunt identice.

O "entitate", cunoscută și sub denumirea de "obiect gestionat", este similară cu o tabelă. Este o definiție a unui obiect care va conține o colecție de date. Un obiect entitate conține "atribute". Acestea pot fi asociate în mod liber cu coloanele, dar aceste atribute nu se limitează doar la stocarea datelor. Atributele pot defini o relație între două entități, o proprietate preluată dinamic sau pot defini o proprietate pentru stocarea datelor.

Din diagrama de mai sus, puteți obține un simț pentru modul în care obiectele flexibile derivate din entitățile de date de bază sunt. Pentru această aplicație, vom avea nevoie de o entitate cu adevărat simplă. Vom numi entitatea "Eveniment", care va stoca înregistrări ale turelor noastre.

Ce vom face pentru a crea această entitate este să faceți clic pe butonul [+] din prima (din stânga) coloană superioară. Aceasta va crea o nouă entitate în listă și vizuală pe harta schemelor de sub coloane.

Acesta este un editor vizual frumos pentru modelul dvs. Datele de bază fac într-adevăr ridicarea grele când vine vorba de partea "M" (Model) a MVC. Editorul vizual afișează relațiile, proprietățile și entitățile din magazin, în timp ce schema este creată și gestionată dinamic pentru dvs. Acest lucru este similar cu Interface Builder, deoarece are grijă de alocarea, gestionarea și plasarea obiectelor pentru tine într-o vizualizare UIView fără o singură linie de cod.

Cu noua entitate a evenimentului, dorim să creăm o "proprietate". Din moment ce această proprietate va fi stocarea de date vom seta ca un "atribut". Deci, acest atribut nou va stoca doar data curentă când a fost creată înregistrarea. În aplicația noastră de exemplu vom folosi acest lucru pentru a face referire la orele noastre de tur.

Următoarea coloană din dreapta este locul în care definim proprietățile noastre (asigurați-vă că este selectată entitatea Eveniment). Deci, creați o nouă proprietate utilizând butonul [+] din coloană, selectați "Adăugați atribut".

Vom numi atributul "timeStamp" și vom seta tipul său la "Date". În meniul de selectare tip există tipuri de date similare cu cele ale coloanelor disponibile în sistemele de baze de date relaționale, cum ar fi PostgreSQL sau MySQL, inclusiv tipuri de date cum ar fi numere întregi, flotoare, șiruri, date booleene, date binare (blobs).

Pentru acest atribut, nu avem nevoie de alte opțiuni selectate sau modificate.

Asta este pentru fișierul xcdatamodel și putem trece la integrarea în aplicația noastră. Acum este momentul potrivit pentru a vă salva munca.

Crearea fișierelor noastre de model

Dacă ați folosit un cadru MVC care are definiții ale modelului de bază de date care definesc structura sau comportamentele unui tabel, atunci aceasta va fi o sarcină familiară.

Trebuie să începem prin crearea unei definiții a entității. Facem acest lucru prin crearea unei clase NSManagedObject a entității și definirea variabilelor stocate.

Acesta este un proces simplu. Selectați entitatea Eveniment din fișierul LapTimer.xcdatamodel și mergeți la File> File New. Veți vedea că există un nou șablon de fișier în secțiunea "Cocoa Touch Class" denumită "Class Object Managed".

Selectați șablonul și apăsați "Next". Următorul ecran este doar definirea locului în care salvăm fișierul și ținta pentru ao include, toate acestea fiind corecte în mod prestabilit, astfel încât să apară din nou "Următorul". Următorul ecran este locul în care definiți entitățile pentru care doriți să creați clase NSManagedObject pentru. Dacă nu este selectat, selectați Eveniment și asigurați-vă că sunt selectate casetele de selectare "Generați accesoriile" și "Generați proprietățile Obj-C 2.0"; în acest moment nu vom avea nevoie de validări. Hit Finish.

Deci, acum avem 2 fișiere noi în aplicația noastră. Event.m și Event.h. Ei definesc clasa NSManagedObject pentru entitatea evenimentului pe care am creat-o in magazinul nostru de date de baza. Ei definesc câmpul timeStamp astfel încât atunci când dorim să folosim clasa Eveniment putem accesa atributul.

Event.h

 #import  @interface Eveniment: NSManagedObject  @property (nonatomic, reține) NSDate * timeStamp; @Sfârșit 

Event.m

 #import "Event.h" @implementation Eveniment @dynamic timeStamp; @Sfârșit 

Ca și definițiile de model în alte cadre și limbi, puteți adăuga metode personalizate pentru toate înregistrările din entitatea evenimentului. Veți observa că atributul timeStamp a fost adăugat și atribuit ca un obiect NSDate.

Datele principale și KVC

Cu setarea datelor de bază este acum timpul să lucrați la o parte din logica controlerului din aplicație. Vom folosi un UITableViewController ca interfață principală a aplicației pentru a afișa orele de tur, precum și pentru a înregistra un nou moment.

Deci, vom crea noul UITableViewController cu File> File New. Apoi sub secțiunea iPhone selectați "subclasa UIViewController" și bifați "subclasa UITableViewController", dar nu bifați casetele care se referă la utilizarea XIB sau pentru direcționare pentru un iPad. Nu vom folosi un XIB pentru acest controler. Apelați noul fișier "TimeTableController" și terminați asistentul de fișier.

În acest controler vom avea nevoie de 2 proprietăți, o referință la NSManagedObjectContext și un matrice pentru stocarea înregistrărilor pentru UITableView. Pe lângă definirea acelor proprietăți, vom importa fișierul Event.h astfel încât să putem folosi clasa.

TimeTableController.h

 #import  #import "Event.h" @interface TimeTableController: UITableViewController NSManagedObjectContext * managedObjectContext; NSMutableArray * eventArray;  @property (nonatomic, păstrează) NSManagedObjectContext * managedObjectContext; @property (nonatomic, reține) NSMutableArray * eventArray; - (void) fetchRecords; - (void) addTime: (id) expeditor; @Sfârșit 

Ce este un NSManagedObjectContext? Este denumit "pad de zgârieturi" pentru datele de bază în aplicația pentru gestionarea preluării, actualizării și creării de înregistrări în magazin. De asemenea, gestionează câteva caracteristici fundamentale ale datelor de bază, inclusiv validările și gestionarea anula / redo-ul pentru înregistrări.

Contextul obiect gestionat este legătura dintre codul dvs. și memoria de stocare. Toate operațiile pe care le veți executa pentru datele de bază fac acest lucru în raport cu contextul obiect gestionat. Atunci când se efectuează o solicitare, contextul obiect gestionat va vorbi apoi cu coordonatorul persistent de magazin, care este responsabil pentru maparea obiectelor la datele pentru stocarea datelor. Acest lucru permite ca datele de bază să fie flexibile între diferite formate de stocare de date. Iată o diagramă a modului în care arată asta.

Cu fișierul cu antet definit, trebuie să propagăm proprietățile și metodele alocate în fișierul de implementare.

TimeTableController.m

 #import "TimeTableController.h" @implementation TimeTableController @synthesize managedObjectContext, eventArray; // ... // ... implicit codul comentat din șablonul de fișier // ... - (void) viewDidLoad [super viewDidLoad]; auto.title = @ "Lap Times"; UIBarButtonItem * addButton = [[UIBarButtonItem alin] initWithBarButtonSystemItem: UIBarButtonSystemItemAdd target: acțiunea de sine: @selector (addTime :)]; auto.navigationItem.rightBarButtonItem = addButton; [releaseButton release]; [self fetchRecords];  - (void) addTime: (id) expeditor Event * event = (Eveniment *) [NSEntityDescription insertNewObjectForEntityForName: @ "Eveniment" inManagedObjectContext: managedObjectContext]; [event setTimeStamp: [Data NSDate]]; Eroare NSError *; dacă (! [managedObjectContext save: & error]) // Aceasta este o eroare gravă care spune că înregistrarea // nu a putut fi salvată. Recomanda utilizatorului să încerce din nou sau să repornească aplicația.  [eventArray insertObject: eveniment laIndex: 0]; [self.tableView reloadData];  - (void) fetchRecords // Definirea tabelului / entității noastre pentru a utiliza NSEntityDescription * entity = [NSEntityDescription entityForName: @ "Event" inManagedObjectContext: managedObjectContext]; // Configurarea solicitării de preluare NSFetchRequest * request = [[NSFetchRequest alloc] init]; [request setEntity: entitate]; // Definiți cum vom sorta înregistrările NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey: @ "timeStamp" ascendent: NO]; NSArray * sortDescriptors = [NASrray arrayWithObject: sortDescriptor]; [request setSortDescriptors: sortDescriptors]; [releaseDescriptor release]; // Returnați înregistrările și gestionați o eroare NSError * eroare; NSMutableArray * mutableFetchResults = [[managedObjectContext executeFetchRequest: eroare cerere: & eroare] mutableCopy]; dacă (! mutableFetchResults) // Efectuați eroarea. // Aceasta este o eroare gravă și ar trebui să sfătuiască utilizatorul să repornească aplicația // Salvează datele noastre preluate într-o matrice [self setEventArray: mutableFetchResults]; [eliberare mutableFetchResults]; [cerere de eliberare];  // ... // // mai multe comentarii de șablon și definiții de metode implicite // ... - (void) dealloc [managedObjectContext release]; [releaseArray release]; [super dealloc];  @Sfârșit 

Acesta este un pic echitabil de cod, așa că permiteți să treceți prin fiecare metodă individual. Există un cod de la momentul creării fișierului din șablon, au comentat metode precum viewDidUnload, pe care tocmai l-am lăsat de la cele de mai sus.

viewDidLoad

Începem cu apelul obișnuit la clasa super. Apoi definim titlul UINavigationBar. După aceasta, trebuie să definim butonul pe care îl vom folosi pentru a adăuga o înregistrare la magazinul de date de bază. Când butonul este apăsat, îi spunem să apeleze selectorul addTime: care va interacționa apoi cu datele de bază. După eliberările necesare, ajungem la apelarea funcției fetchRecords, explicată mai jos.

addTime: (id) expeditor

Acesta este declanșat când este apăsat UIBarButtonItem din partea dreaptă sus a UINavigationBar. Trebuie să creați o nouă înregistrare de eveniment cu NSDate actuală și să o salvați în baza de date.

Creăm o nouă înregistrare de eveniment numită NSEntityDescription. Acesta este rândul dvs. din baza de date pentru noua înregistrare. Pentru a face acest lucru, definim numele entității care aparține înregistrării și furnizează NSManagedObjectContext. Data curentă este apoi setată în funcție de atributul timeStamp.

Operația de salvare este apoi executată, însă există o dispoziție de a gestiona o eroare dacă inserția nu reușește. Ar fi de obicei aruncat un UIAlertView spunând că înregistrarea nu a fost creată și poate instrui utilizatorul să încerce din nou sau să închidă și redeschide aplicația.

Înregistrările trebuie să fie adăugate la matricea de la care se alimentează UITableView. Apoi, UITableView trebuie spus să reîncarce datele. Puteți face acest lucru mai mult grafic cu o animație, dar de dragul tutorialului, să o păstrăm simplu.

fetchData

Această metodă va primi datele din magazin și le vom adăuga la matricea pe care o avem în controler. Pentru mai multe detalii despre obținerea înregistrărilor, aruncăm o privire mai atentă la NSFetchRequest.

Preluarea datelor din depozitul de date

Datele de bază au o abordare diferită pentru a prelua date din baza de date. Este un magazin de date NoSQL, ceea ce înseamnă că toate condițiile unei interogări se bazează pe metode. Acest lucru este minunat, deoarece magazinul de bază, care este SQLite, ar putea fi modificat la orice altă tehnologie de bază de date și singurul lucru de schimbat ar fi conexiunea și driverele pentru baza de date.

Deci, pentru a crea o cerere, vom crea un obiect NSFetchRequest. Acesta este obiectul de bază pe care vor fi setate condițiile de interogare. Putem defini condițiile pentru potrivirea unei anumite proprietăți în funcție de modul în care sunt ordonate înregistrările. Puteți afla mai multe despre datele de bază și condițiile lor pentru NSFetchRequests în documentația lor.

Crearea unei noi cereri NSFetch este simplă. Trebuie doar să definiți entitatea din care doriți înregistrări și NSManagedObjectContext.

 NSEntityDescription * entity = [NSEntityDescription entityForName: @ "Eveniment" inManagedObjectContext: managedObjectContext]; NSFetchRequest * request = [[NSFetchRequest alocare] init]; [request setEntity: entitate]; 

Entitatea este definită utilizând un obiect NSEntityDescription care necesită numele entității și NSManagedObjectContext. Cererea de preluare este apoi creată pentru a trece descrierea entității. Acest lucru ar echivala cu prima parte a unei instrucțiuni SQL:

 SELECT * FROM 'evenimente' 

În aplicația noastră de exemplu, ordonăm datele în funcție de timp, într-o manieră descendentă. Pentru a face acest lucru, folosim un NSSortDescriptor.

 NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alocare] initWithKey: @ "timeStamp" ascendent: NO]; NSArray * sortDescriptors = [NASrray arrayWithObject: sortDescriptor]; [request setSortDescriptors: sortDescriptors]; [releaseDescriptor release]; 

NSSortDescriptorul este creat și definim atributul pe care dorim să-l sortăm și când acesta este ascendent, în acest caz dorim ca acesta să coboare astfel încât să fie setat la NU. Solicitarea de preluare poate lua mai multe descriptori de sortare, astfel încât să accepte o matrice atunci când setează descriptorii de sortare. Din moment ce dorim doar unul, trebuie doar să creăm o matrice cu un obiect în el. Am setat matricea descriptorului în funcție de solicitarea de preluare și asta este.

Pentru definirea unei condiții care să corespundă conținutului înregistrărilor, clasa NSPredicate intră în joc. Aceasta permite potrivirea solicitării de preluare sau definirea unui interval pe care trebuie să îl îndeplinească conținutul unei înregistrări. Aceasta este echivalentă cu egalitatea dvs., mai mare și mai mică decât cea din SQL. Are mai mult decât funcțiile SQL de bază, pe care le puteți vedea aici.

Setarea unui predicat poate fi foarte simplă.

 NSPredicate * predicate = [NSPredicate predicateWithFormat: @ "(NumeNumăr ca% @) ȘI (ziua de naștere>% @)", lastNameSearchString, birthdaySearchDate]; 

Utilizarea predicatelor NSPredicateWithFormat: este o metodă simplă și familiară care vă permite să definiți condițiile interogării. Pentru o explicație în profunzime despre NSP, documentația Apple are niște ghiduri grozave.

După ce ați definit condițiile din solicitarea de preluare, puteți să o executați.

 NSMutableArray * mutableFetchResults = [[managedObjectContext executeFetchRequest: eroare cerere: & eroare] mutableCopy]; 

Acest lucru va returna o serie de obiecte entitate, NSManagedObjects, pentru a le utiliza în ieșirea de date.

Populația UITableView din datele de bază

Cu datele preluate din datele de bază și stocate în eventArray putem ieși acum acele înregistrări în UITableView.

Primul lucru este să spunem tabelului că vom cere doar o secțiune și câte rânduri trebuie să folosim.

Extras din TimeTableController.m

 -(NSInteger) numberOfSectionsInTableView: (UITableView *) tableView retur 1;  - (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) sectiunea retur [eventArray count];  

Dacă ați folosit un UITableViewController înainte, următoarea funcție ar trebui să fie dreaptă.

 -(UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath NSString static * CellIdentifier = @ "Cell"; static NSDateFormatter * dateFormatter = zero; dacă (dateFormatter == zero) dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat: @ "h: mm.ss a"];  UITableViewCell * celula = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; dacă (celula == zero) cell = [[[UITableViewCell aliniere] initWithStyle: UITableViewCellStyleValue1 reuseIdentifier: CellIdentifier] autorelease];  Event * event = [eventArray objectAtIndex: [indexPath row]]; Eveniment * precedentEvent = zero; dacă [[countArray count]> ([indexPath row] + 1)) previousEvent = [eventArray objectAtIndex: ([indexPath row] + 1)];  [celula.textLabel setText: [dateFormatter stringFromDate: [event timeStamp]]; dacă (precedentEvent) NSTimeInterval timeDifference = [[event timeStamp] timeIntervalSinceDate: [previousEvent timeStamp]]; [cell.detailTextLabel setText: [NSString șirWithFormat: @ "+%. 02f sec", timeDifference]];  altceva [cell.detailTextLabel setText: @ "---"];  retur;  

Celula va afișa 2 valori, de la utilizarea stilului UITableViewCellStyleValue1. Stânga va fi ora turului, iar dreapta va fi diferența în secunde față de înregistrarea anterioară.

Deoarece această metodă repetă, trebuie să avem grijă deosebită cu încărcarea pe care o poate pune sub dispozitiv dacă nu este gestionată corect. Din acest motiv, NSDatFormatter este stocat ca o variabilă statică, astfel încât să poată fi reutilizat în fiecare iterație fără al aloca și elibera de fiecare dată.

Lazy Loading

Lazy Loading este o tehnică în care întârzieți solicitarea sau alocarea unei proprietăți cât mai mult posibil. Acest lucru ajută la menținerea memoriei și în timpul funcțiilor iterative acest lucru este de o importanță capitală. Știind când și cum să alocăm date este esențială pentru menținerea rapidă a unei aplicații mobile. Dealocarea obiectului este la fel de importantă, cu atât mai devreme cu atât mai bine.

cellForRowAtIndexPath: este o metodă iterativă și toate datele procesate sau alocate în această metodă trebuie în special menținute la minimum. Această metodă este rulată ori de câte ori o celulă intră în vedere, astfel încât atunci când un utilizator derulează rapid această metodă particulară, în funcție de dimensiunea setului de înregistrare, poate fi apelată foarte frecvent succesiv.

Următoarea sarcină este ca obiectul evenimentului să fie asociat cu rândul de tabel care trebuie să fie redat. Deoarece trebuie să obținem înregistrarea anterioară pentru compararea timpului, există o verificare simplă pentru a vedea dacă există o înregistrare anterioară și pentru a fi stocată în precedent. Dacă precedentEvent există, atunci vom calcula împărțirea folosind [NSDate timeIntervalSinceDate: (NSDate)]. TextLabel și text detaliatText sunt apoi setate cu valorile pe care le-am calculat.

Finalizarea aplicației

Cu ajutorul configurației UITableViewController și a sursei de date de tabelă care lucrează cu memoria de date de bază, tot ceea ce este necesar este încărcarea controlerului când aplicația este pornită.

În controlerul aplicației este necesară definirea unei proprietăți UINavigationController. Apoi metoda applicationDidFinishLaunching trebuie doar să aloce controlerul și am terminat.

LapTimerAppDelegate.h

 @ interfață LapTimerAppDelegate: NSObject  NSManagedObjectModel * managedObjectModel; NSManagedObjectContext * managedObjectContext; Coordonator NSPsistentStore * Coordonator persistentStore; Fereastra UIWindow *; UINavigationController * navigationController;  @property (nonatomic, reține, readonly) NSManagedObjectModel * managedObjectModel; @property (nonatomic, reține, readonly) NSManagedObjectContext * managedObjectContext; @property (nonatomic, rețineți, readonly) NSPersistentStoreCoordinator * persistentStoreCoordinator; @property (nonatomic, reține) fereastra IBOutlet UIWindow *; @property (nonatomic, reține) UINavigationController * navigationController; - (NSString *) cerereDocumentsDirectory; @Sfârșit 

Extras din LapTimerAppDelegate.m

 #import "LapTimerAppDelegate.h" #import "TimeTableController.h" @implementation LapTimerAppDelegate @ fereastră Synthesize, navigationController; - (void) applicationDidFinishLaunching: (UIApplication *) aplicație TimeTableController * tableController = [[TimeTableController alloc] initWithStyle: UITableViewStylePlain]; tableController.managedObjectContext = [self managedObjectContext]; auto.navigationController = [[UINavigationController alocare] initWithRootViewController: tableController]; [tableController release]; [window addSubview: [auto.navigationController view]]; [fereastra makeKeyAndVisible];  // ... // // alte metode de șablon // ... - (void) dealloc [managedObjectContext release]; [releaseObjectModel release]; [release sustainStoreCoordinator]; [eliberare fereastră]; [releaseController release]; [super dealloc];  

Fișierul TimeTableController.h este inclus în delegatul aplicației și apoi alocat unui UINavigationController.

Asta ar trebui să fie. Construiți aplicația pentru a verifica erorile. Unele dintre exemplele de cod au fost doar extrase, nici unul din codul care este generat la crearea unui fișier a fost eliminat, doar completat. Dacă întâmpinați erori pe care nu le puteți sparge, puteți descărca fișierul proiect atașat acestui tutorial pe care le puteți compila și compara.

Rulați aplicația. Veți vedea controlerul de navigație și butonul de adăugare. Apăsați butonul de adăugare și veți primi un nou timp în tabel.

Recapitulare

În acest tutorial am creat o aplicație de exemplu pentru a stoca date simple într-un magazin de date de bază. Aplicația a rulat prin procedura inițială de configurare atunci când a creat o aplicație cu date de bază, definind structura de date și preluând înregistrările din stocul de date.

Sperăm că ați primit o introducere la Core Data și puteți vedea cât de ușor este de folosit și cum poate îmbunătăți performanța și funcționalitatea aplicațiilor dvs..

Dacă doriți să aflați mai multe despre datele de bază sau doriți o privire detaliată asupra structurii cadrului, atunci Documentația dezvoltatorului Apple este locul perfect pentru a merge.

Resurse

Documentația dezvoltatorului Apple:

Introducere în programarea datelor de bază

Core Migrarea datelor și versiunea

Ghidul de programare NSPredicate:

Cod