În tutorialul anterior, ați învățat cum să definiți constrângerile comune în modelul de date. În acest tutorial, vă arăt cum puteți defini constrângeri mai avansate în cod.
Descărcați proiectul creat în tutorialul anterior de la GitHub și deschideți-l în Xcode. Deschis AppDelegate.swift și să actualizeze punerea în aplicare a aplicație (_: didFinishLaunchingWithOptions)
așa cum se arată mai jos.
funcția (cerere: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if let entity = NSEntityDescription.entityForName ("User", inManagedObjectContext: self.managedObjectContext) // Create Object Managed user = NSManagedObject entitate: entitate, insertIntoManagedObjectContext: self.managedObjectContext) // Populate Obiect gestionat user.setValue (44, pentruKey: "vârstă") user.setValue ("Bart", pentruKey: "first") user.setValue : last) user.setValue ("[email protected]", pentruKey: "e-mail") try user.validateForInsert () catch let validationError = eroare ca NSError print (validationError)
Dacă rulați aplicația în simulator sau pe un dispozitiv fizic, nu trebuie aruncate nici un fel de erori. Cu alte cuvinte, obiectul gestionat pe care îl creăm aplicație (_: didFinishLaunchingWithOptions)
transmite validarea pentru inserarea în magazinul persistent al aplicației.
NSManagedObject
Pentru a valida valoarea unui atribut în cod, trebuie să creați un NSManagedObject
subclasă. Alege Nou> Fișier ... din Xcode Fişier meniu și selectați Datele principale> subclasa NSManagedObject șablon din lista de șabloane.
Selectați modelul de date al proiectului și verificați entitățile pentru care doriți să creați un NSManagedObject
subclasă.
Verifica Utilizați proprietăți scalare pentru tipurile de date primitive, spuneți Xcode unde doriți să salvați fișierele pentru subclase și faceți clic pe Crea.
Pentru a valida proprietatea unei entități, implementați o metodă care are următorul format, valida
. Metoda ar trebui să fie o metodă de aruncare. În cazul în care validarea nu reușește, se aruncă o eroare, notificând datele de bază că valoarea pentru proprietate este nevalidă.
În exemplul de mai jos, am implementat o metodă de validare pentru primul
proprietate a Utilizator entitate. Adăugați următorul fragment la User.swift.
importați CoreData importare clasă Fundație Utilizator: NSManagedObject permite errorDomain = "UserErrorDomain" enum UserErrorType: Int caz InvalidFirst func validateFirst (valoare: AutoreleasingUnsafeMutablePointer) aruncă var error: NSError? = nil; dacă ați lăsat prima = value.memory ca? String if first == "" lăsați errorType = UserErrorType.InvalidFirst error = NSError (domeniu: errorDomain, code: errorType.rawValue, userInfo: [NSLocalizedDescriptionKey: "Primul nume nu poate fi gol" errorType = UserErrorType.InvalidFirst error = NSError (domeniu: errorDomain, code: errorType.rawValue, userInfo: [NSLocalizedDescriptionKey: "Primul nume nu poate fi gol"]) dacă eroare error = error throw error
Metoda de validare acceptă un parametru de tip AutoreleasingUnsafeMutablePointer
. Ce este asta? Nu lăsați tipul de parametru să vă sperie. După cum indică numele tipului, AutoreleasingUnsafeMutablePointer
structura este un pointer mutable. Ea indică o referință de obiect. Putem accesa valoarea la care indicatorul indică prin ea memorie
proprietate.
După cum am menționat acum un moment, validateFirst (_ :)
metoda este aruncarea. Dacă valoarea ne-a fost înmânată nu este validă, aruncăm o eroare. Prin aruncarea unei erori, informăm Core Data că obiectul gestionat este nevalid.
În următorul exemplu, pun în aplicare o metodă de validare pentru proprietatea de e-mail a Utilizator
clasă. Folosim o expresie regulată pentru a valida valoarea e-mail
proprietate.
func validateEmail (valoare: AutoreleasingUnsafeMutablePointer) aruncă var error: NSError? = zero dacă e-mail = value.memory ca? String lasa regex = "^. + @ ([A-Za-z0-9 -] + \\.) + A-Za-z] NSPredicate (format: SELF MATCHES% @, regex) dacă! Predicate.evaluateWithObject (email) let errorType = Eroare UserErrorType.InvalidEmail = NSError (domeniu: errorDomain, code: errorType.rawValue, userInfo: [NSLocalizedDescriptionKey: adresa este invalidă.]] altceva let errorType = Eroare UserErrorType.InvalidEmail = NSError (domeniu: errorDomain, code: errorType.rawValue, userInfo: [NSLocalizedDescriptionKey: "Adresa e-mail este nevalidă" = eroare aruncă eroare
Chiar dacă puteți modifica valoarea proprietății într-o metodă de validare, Apple descurajează puternic acest lucru. Dacă modificați valoarea care ți-a fost transmisă printr-o metodă de validare, gestionarea memoriei ar putea să nu se întâmple. În acest sens, fluxul de validare a datelor devine foarte simplu. Validați valoarea proprietății și aruncați o eroare dacă aceasta este nevalidă. Este atât de simplu.
Modificați valorile atributelor în aplicație (_: didFinishLaunchingWithOptions)
și rulați aplicația în simulator. Dacă valorile pe care le-ați introdus sunt nevalide, ar trebui să fie aruncată o eroare.
NSManagedObject
clasa expune trei cârlige suplimentare subclasele pot suprascrie pentru validarea datelor:
validateForInsert ()
validateForUpdate ()
validateForDelete ()
Aceste metode sunt invocate de datele de bază privind obiectul gestionat înainte de a introduce, actualiza sau șterge înregistrarea corespunzătoare din magazinul persistent. Fiecare dintre aceste metode aruncă. Dacă este aruncată o eroare, inserarea corespunzătoare, actualizarea sau ștergerea corespunzătoare sunt întrerupte.
Chiar dacă beneficiile pe care aceste cârlige le au asupra metodelor de validare a proprietăților pe care le-am discutat mai devreme nu pot fi imediat evidente, acestea sunt neprețuite în mai multe scenarii. Imaginați-vă că o înregistrare a utilizatorului nu poate fi ștearsă atât timp cât are asociată una sau mai multe înregistrări de note. În acest caz, puteți să ignorați validateForDelete ()
metodă în Utilizator
clasă.
suprascrie func validateForDelete () aruncă try super.validateForDelete () var eroare: NSError? = zero dacă notele note = note if notes.count> 0 let eroareType = UserErrorType.OneOrMoreNotes error = NSError (domeniu: errorDomain, code: errorType.rawValue, userInfo: [NSLocalizedDescriptionKey: "Un utilizator cu note nu poate fi șters ..." ]) dacă eroare eroare = eroare aruncă eroare
Rețineți că folosim trece peste
cuvânt cheie și invoca validateForDelete ()
implementarea superclasei în partea de sus. Dacă înregistrarea utilizatorului este legată de una sau mai multe înregistrări ale notei, o eroare este aruncată, împiedicând ștergerea înregistrării utilizatorului.
Validarea datelor este un aspect important al fiecărei aplicații care funcționează cu datele. Core Data furnizează dezvoltatorilor mai multe API-uri pentru implementarea validării datelor. Dar s-ar putea să te întrebi ce opțiune sau opțiuni să folosești în aplicația ta.
Acest lucru depinde de preferințele dvs. și de cerințele proiectului. Pentru un model simplu de date cu constrângeri comune, opțiunile oferite de modelul de date pot fi suficiente. Acestea fiind spuse, unii dezvoltatori preferă să păstreze logica validării în clasele de model, adică în NSManagedObject
subclase. Avantajul este că logica pentru o anumită clasă de model este localizată într-un singur loc.
Pentru logica de validare mai complexă, metodele de validare personalizate pentru proprietăți sau validateForInsert ()
, validateForUpdate ()
, și validateForDelete ()
cârligele sunt recomandate. Ele adaugă puterea și flexibilitatea de a obiecta validarea și de asemenea aveți avantajul că stratul model include logica de validare.
Este important să înțelegem că validarea datelor constă în două aspecte: logica validării datelor și validarea datelor. Stratul de model este responsabil de validarea datelor. Controlorul este responsabil de a decide când trebuie efectuată validarea datelor, de exemplu, atunci când utilizatorul pune un buton pentru a crea un cont. Aceasta este o diferență subtilă, dar importantă.
Nu în ultimul rând, evitați punerea logicii de validare a datelor în stratul controlerului. În mod inutil controlează controlorii proiectului dvs. și, de obicei, duce la dublarea codului.
Datele principale fac validarea datelor ușor și direct. Modelul de date vă ajută cu constrângeri comune, dar cadrul expune și mai multe API avansate pentru validarea datelor personalizate.