Validarea datelor cu date de bază Constrângeri comune

Indiferent de cadrul de persistență al unei aplicații, dezvoltatorul decide ce este stocat în memoria persistentă a aplicației. Acest lucru înseamnă, de asemenea, că dezvoltatorul este responsabil cu validarea datelor înainte de a fi introdus în magazinul persistent.

Dacă aplicația utilizează date de bază pentru date persistente, atunci aveți noroc. Cadrul are un număr de API-uri pentru validarea obiectelor înainte de a fi persistente pe disc. În acest tutorial, vă arăt ce opțiuni oferă Core Data dezvoltatorilor pentru validarea obiectelor.

1. Configurarea proiectului

Cel mai bun mod de a învăța este prin a face. Deschideți Xcode și creați un nou proiect bazat pe Vizualizare individuală șablon.

Denumiți proiectul Validare și stabilit Limba la Rapid. Verifica Utilizați datele de bază în partea de jos și faceți clic pe Următor →.

2. Populați modelul de date

Deschis Validation.xcdatamodeld, creați o entitate nouă și denumiți-o Utilizator. Adăugați următoarele atribute entității utilizator:

  • primul de tip Şir
  • ultimul de tip Şir
  • e-mail de tip Şir
  • vârstă de tip Integerul 16

Creați o altă entitate, denumiți-o Notă, și adăugați entităților următoarele atribute:

  • titlu de tip Şir
  • cuprins de tip Şir
  • creat la de tip Data

Un utilizator poate avea multe note și o notă poate aparține unui singur utilizator. Aceasta înseamnă că trebuie să adăugăm o La multe relație cu Utilizator entitate cu Notă entitate ca destinație. Trebuie, de asemenea, să adăugăm o Catre unul relație cu Notă entitate cu Utilizator entitate ca destinație și notițe ca relație inversă. Acesta este modul în care arată în editorul de date Xcode.

3. Constrângerea atributelor

Constrângerile comune pot fi definite în modelul de date. Permiteți-mi să vă arăt cum funcționează. Deschis Validation.xcdatamodeld și selectați Utilizator entitate. Selectează e-mail atribuiți și deschideți Inspector model de date pe dreapta.

În Validare , puteți seta lungimea minimă și maximă a atributului. Puteți introduce chiar și o expresie regulată, valoarea atributului trebuie să se potrivească pentru a fi valabilă. Inspector model de date adaugă, de asemenea, capacitatea de a seta o valoare implicită, care este convenabilă pentru atributele cerute.

Acest lucru ne duce la cea mai evidentă constrângere pentru atribute, opționalitatea lor. Prin debifarea opțiunii facultativ în partea de sus, îi spuneți Core Data că atributul trebuie să aibă o valoare pentru ca acesta să fie valabil.

Dacă un obiect nu trece validarea, datele de bază aruncă o eroare dacă se efectuează o operație de salvare. Este de la sine înțeles că datele de bază nu permit ca obiectele nevalide să fie împinse la magazinul persistent al aplicației.

Dacă selectați vârstă atributul Utilizator entitate, veți observa că Validare secțiune pare puțin diferită. Deoarece vârstă atributul este de tip Integerul 16, puteți seta o valoare minimă și maximă pentru atribut. De asemenea, puteți defini o valoare implicită.

Selectează creat la atributul Notă entitate și deschideți Inspector model de date. Rețineți că puteți specifica o dată minimă și maximă, precum și o dată prestabilită.

Cel mai important dezavantaj al constrângerilor definite în modelul de date este lipsa de dinamism. De exemplu, dacă doriți să constrângeți un atribut de tip Data la valori bazate pe data curentă, atunci trebuie să implementați validarea personalizată în cod. Aruncăm o privire la modul în care funcționează mai târziu.

4. Relațiile de constrângere

Relațiile nu sunt foarte diferite de atribute. Și ei pot fi constrânși. O relație poate fi opțională sau necesară. Numărătoarea a La multe relația poate fi limitată la o valoare minimă și maximă. Selectează notițe atributul Utilizator entitate și deschideți Inspector model de date. Numărul contelui notițe relația poate avea o valoare minimă și maximă.

Având capacitatea de a adăuga constrângeri la un model de date este un concept puternic și este bine să știți că acesta este integrat în cadrul Core Data.

5. Validarea obiectelor

Selectează Utilizator entitate și marcați fiecare atribut așa cum este necesar prin debifarea facultativ în caseta de selectare Inspector model de date. Selectează vârstă atribuiți și setați valoarea minimă la 0 și valoarea maximă la 120. Setați valoarea implicită a atributului la 21.

Deschis AppDelegate.swift și actualizare aplicare (_: didFinishLaunchingWithOptions :) așa cum se arată mai jos. Creăm o instanță a Utilizator entitate și să-i populeze atributele. Rețineți că am setat vârstă atribuiți unei valori care depășește valoarea maximă specificată în modelul de date. Putem cere obiectului gestionat dacă este valabil pentru inserarea în magazinul persistent invocând validateForInsert (). Deoarece această metodă aruncă, o înfășurăm într-o do-catch afirmație.

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 (140, pentruKey: "vârstă") user.setValue ("Bart", pentruKey: "first") user.setValue ("Jacobs" : last) user.setValue ("[email protected]", pentruKey: "e-mail") try user.validateForInsert () catch let validationError = eroare ca NSError print (validationError)

Dacă executați aplicația în simulator sau pe un dispozitiv fizic, ar trebui să vedeți următoarea eroare în consolă.

Domeniu de eroare = NSCocoaErrorDomain Code = 1610 "Operația nu a putut fi completată (eroare de cacao 1610.)" UserInfo = NSValidationErrorObject = (entitate: utilizator; id: 0x7fef63613eb0  ; date: vârstă = 140; email = "[email protected]"; prima = Bart; ultimul = Jacobs; note = (); ), NSValidationErrorValue = 140, NSValidationErrorKey = vârstă, NSLocalizedDescription = Operația nu a putut fi terminată. (Eroarea de cacao 1610.)

Eroarea este destul de clară despre ceea ce este în neregulă cu obiectul gestionat. Chiar dacă descrierea localizată este puțin vagă, eroarea indică valoarea lui vârstă atributul nu corespunde constrângerilor pe care le-am definit în modelul de date.

Este posibil ca erori de validare multiple să fie aruncate în timpul validării. Permiteți-mi să vă arăt cum arată. Pentru a evita problema migrării, ștergeți aplicația din simulator. Revedeți modelul de date și selectați ultimul atributul Utilizator entitate. Deschide Inspector model de date în dreapta și debifați facultativ pentru a face atributul necesar.

Deschis AppDelegate.swift și elimina linia în care am setat numele de familie Utilizator record.

user.setValue ("Jacobs", pentruKey: "ultimul")

Rulați din nou aplicația și inspectați-o pentru a ieși din consola.

Eroare Domain = Cod NSCocoaErrorDomain = 1560 "(null)" UserInfo = NSDetailedErrors = ("Domeniu de eroare = NSCocoaErrorDomain Code = 1610 \" UserInfo = NSValidationErrorObject = (entitate: Utilizator; id: 0x7feab84196f0  ; date: \ n vârstă = 140; \ n email = \ "[email protected] \"; \ n first = Bart; \ n last = nil; \ nnotes = (\ n); \ n), NSValidationErrorValue = 140, NSValidationErrorKey = vârstă, NSLocalizedDescription = Operația nu a putut fi terminată. (Eroare de cacao 1610.) "," Domeniu de eroare = NSCocoaErrorDomain Code = 1570 \ "Operația nu a putut fi completată (Eroare de cacao 1570.) \" UserInfo = NSValidationErrorKey = ultima, NSLocalizedDescription = finalizat. (Eroare de cacao 1570.), NSValidationErrorObject = (entitate: Utilizator; id: 0x7feab84196f0  ; date: \ n vârstă = 140; \ n email = \ "[email protected] \"; \ n first = Bart; \ n last = nil; \ n notes = )

userinfo dicționarul obiectului de eroare conține o serie de erori care ne informează ce sa întâmplat în timpul validării. Înțelegeți că aceleași erori sunt aruncate dacă încercați să salvați un obiect gestionat care nu trece validarea.

Concluzie

Validarea datelor este un aspect cheie al persistenței datelor. Trebuie să vă asigurați că datele pe care le inserați în magazinul persistent sunt valide. Cu alte cuvinte, datele introduse trebuie să se conformeze cerințelor pe care le-ați definit în modelul de date și codul aplicației.

Săptămâna viitoare, vă arăt cum puteți crea mai complexe reguli de validare în cod. Chiar dacă această abordare necesită mai multă muncă, normele de validare în cod sunt mai flexibile și mai puternice.

Cod