Data validering med kjerne data Vanlige begrensninger

Uansett hvilken utholdenhetsramme et program bruker, bestemmer utvikleren hva som er lagret i programmets vedvarende butikk. Dette betyr også at utvikleren har ansvaret for å validere dataene før den settes inn i den vedvarende butikken.

Hvis din søknad bruker Core Data for vedvarende data, så har du lykken. Rammeverket har en rekke APIer for å validere objekter før de vedvarer på disken. I denne veiledningen viser jeg deg hvilke alternativer Core Data tilbyr utviklere for å validere objekter.

1. Prosjektoppsett

Den beste måten å lære på er å gjøre. Åpne Xcode og opprett et nytt prosjekt basert på Enkeltvisningsprogram mal.

Gi navnet navnet på prosjektet Validering og sett Språk til Fort. Kryss av Bruk Core Data nederst og klikk neste.

2. Populere Data Model

Åpen Validation.xcdatamodeld, opprett en ny enhet, og navngi den brukeren. Legg til følgende attributter til brukerenheten:

  • først av type string
  • siste av type string
  • e-post av type string
  • alder av type Helhet 16

Opprett en annen enhet, navn den Merk, og legg til følgende attributter til enheten:

  • tittel av type string
  • innhold av type string
  • createdAt av type Dato

En bruker kan ha mange notater, og et notat kan bare tilhøre en bruker. Dette betyr at vi må legge til en For mange forhold til Bruker enhet med Merk enhet som destinasjon. Vi må også legge til en Til en forhold til Merk enhet med Bruker enhet som destinasjon og notater som det omvendte forholdet. Dette er det som ser ut i Xcode's datamodelleditor.

3. Begrensningsattributter

Vanlige begrensninger kan defineres i datamodellen. La meg vise deg hvordan dette fungerer. Åpen Validation.xcdatamodeld og velg Bruker enhet. Velg e-post Tilordne og åpne Datamodellinspektør til høyre.

I Validering delen, kan du angi minimum og maksimum lengde på attributtet. Du kan til og med legge inn et vanlig uttrykk verdien av attributtet må samsvare for å være gyldig. De Datamodellinspektør legger også til muligheten til å angi en standardverdi, som er praktisk for nødvendige egenskaper.

Dette bringer oss til den mest åpenbare begrensningen for attributter, deres valgfrihet. Ved å fjerne merket fra Valgfri i boksen øverst, forteller du Core Data at attributtet må ha en verdi for at den skal være gyldig.

Hvis et objekt ikke bestått validering, kaster Core Data en feil hvis en lagringsoperasjon utføres. Det sier seg selv at Core Data ikke tillater ugyldige objekter å bli presset til programmets vedvarende butikk.

Hvis du velger alder attributten til Bruker enhet, vil du legge merke til at Validering delen ser litt annerledes ut. Fordi det alder Attributtet er av typen Helhet 16, Du kan angi en minimums- og en maksimumsverdi for attributtet. Du kan også definere en standardverdi.

Velg createdAt attributten til Merk enhet og åpne Datamodellinspektør. Merk at du kan angi en minimums- og en maksimumsdato, samt en standarddato.

Den viktigste ulempen av begrensninger definert i datamodellen er mangelen på dynamikk. For eksempel, hvis du vil begrense et attribut av typen Dato til verdier basert på dagens dato, må du implementere egendefinert validering i kode. Vi ser på hvordan det fungerer senere.

4. Begrensende forhold

Forhold er ikke veldig forskjellige fra attributter. De kan også være begrenset. Et forhold kan være valgfritt eller påkrevet. Antallet av a For mange forholdet kan begrenses til et minimum og en maksimumsverdi. Velg notater attributten til Bruker enhet og åpne Datamodellinspektør. Antallet av notater forholdet kan ha et minimum og en maksimumsverdi.

Å ha muligheten til å legge til begrensninger i en datamodell er et kraftig konsept, og det er fint å vite at dette er innebygd i Core Data-rammen.

5. Validere objekter

Velg Bruker enhet og merk alle attributter etter behov ved å fjerne merket for Valgfri merk av i boksen Datamodellinspektør. Velg alder Tilordne og sett minimumsverdien til 0 og maksimumsverdien til 120. Angi attributtets standardverdi til 21.

Åpen AppDelegate.swift og oppdater applikasjons (_: didFinishLaunchingWithOptions :) som vist under. Vi lager en forekomst av Bruker enhet og fylle sine attributter. Legg merke til at vi satte alder Tilordne en verdi som overstiger den maksimale verdien vi angav i datamodellen. Vi kan spørre det administrerte objektet om det er gyldig for innsetting i den vedvarende butikken ved å påkalle validateForInsert (). Fordi denne metoden kaster, pakker vi den inn i en gjør-fangst uttalelse.

Funk Application (Application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool hvis la enheten = NSEntityDescription.entityForName ("User", inManagedObjectContext: self.managedObjectContext) // Opprett administrert objekt la bruker = NSManagedObject enhet: enhet, insertIntoManagedObjectContext: self.managedObjectContext) // Populere administrert objekt user.setValue (140, forKey: "alder") user.setValue ("Bart", forKey: "first") user.setValue ("Jacobs", forKey : "last") user.setValue ("[email protected]", forKey: "email") gjør prøv user.validateForInsert () catch let validationError = feil som NSError print (validationError) returner sann

Hvis du kjører programmet i simulatoren eller på en fysisk enhet, bør du se følgende feil i konsollen.

Feil Domene = NSCocoaErrorDomain Code = 1610 "Operasjonen kunne ikke fullføres. (Kakaofeil 1610.)" UserInfo = NSValidationErrorObject = (enhet: Bruker; id: 0x7fef63613eb0  ; data: alder = 140; email = "[email protected]"; først = Bart; sist = Jacobs; notater = (); ), NSValidationErrorValue = 140, NSValidationErrorKey = alder, NSLocalizedDescription = Operasjonen kunne ikke fullføres. (Kakaofeil 1610.)

Feilen er ganske klar over hva som er galt med det administrerte objektet. Selv om lokalisert beskrivelse er litt vag, angir feilen verdien av alder Attributtet oppfyller ikke de begrensningene vi definerte i datamodellen.

Det er mulig at flere valideringsfeil ble kastet under validering. La meg vise deg hvordan det ser ut. For å unngå overføringsproblem, slett programmet fra simulatoren. Endre datamodellen og velg siste attributten til Bruker enhet. Åpne Datamodellinspektør til høyre og fjern markeringen Valgfri for å gjøre det nødvendige attributtet.

Åpen AppDelegate.swift og fjern linjen der vi angir etternavnet til Bruker ta opp.

user.setValue ("Jacobs", forKey: "sist")

Kjør programmet igjen og inspiser for utskrift i konsollen.

Feil Domene = NSCocoaErrorDomain Code = 1560 "(null)" UserInfo = NSDetailedErrors = ("Feil Domain = NSCocoaErrorDomain Code = 1610 \" Operasjonen kunne ikke bli fullført. (Kakaofeil 1610.) \ "UserInfo = NSValidationErrorObject = (enhet: Bruker; id: 0x7feab84196f0  ; data: \ n alder = 140; \ n e-post = \ "[email protected] \"; \ n først = Bart; \ n sist = nil; \ n notater = (\ n); \ n), NSValidationErrorValue = 140, NSValidationErrorKey = alder, NSLocalizedDescription = Operasjonen kunne ikke fullføres. (Kakaofeil 1610.), "Feil Domene = NSCocoaErrorDomain Code = 1570 \" Operasjonen kunne ikke fullføres. (Kakaofeil 1570.) \ "UserInfo = NSValidationErrorKey = last, NSLocalizedDescription = Operasjonen kunne ikke være fullført. (Kakaofeil 1570.), NSValidationErrorObject = (enhet: Bruker; id: 0x7feab84196f0  ; data: \ n alder = 140; \ n e-post = \ "[email protected] \"; \ n først = Bart; \ n sist = nil; \ n notater = (\ n); \ n) " )

De brukerinformasjon Ordboken for feilobjektet inneholder en rekke feil som informerer oss om hva som gikk galt under validering. Forstå at de samme feilene blir kastet hvis du prøver å lagre et administrert objekt som ikke bestått validering.

Konklusjon

Datavalidering er et viktig aspekt ved datautholdenhet. Du må sørge for at dataene du legger inn i vedvarende butikk, er gyldige. Med andre ord, må dataene du legger inn, være i samsvar med kravene du definerer i datamodellen og din søknadskode.

Neste uke viser jeg deg hvordan du kan lage mer komplekse valideringsregler i kode. Selv om denne tilnærmingen krever litt mer arbeid, er valideringsregler i kode mer fleksible og kraftige.