Gegevensvalidatie met kerngegevens gemeenschappelijke beperkingen

Ongeacht welk persistentiekader een toepassing gebruikt, de ontwikkelaar bepaalt wat in de permanente winkel van de toepassing wordt opgeslagen. Dit betekent ook dat de ontwikkelaar verantwoordelijk is voor het valideren van de gegevens voordat deze wordt ingevoegd in de permanente winkel.

Als uw toepassing Core Data gebruikt voor persistente gegevens, heeft u geluk. Het framework heeft een aantal API's voor het valideren van objecten voordat ze blijven bestaan ​​op schijf. In deze zelfstudie laat ik zien welke opties Core Data ontwikkelaars biedt voor het valideren van objecten.

1. Projectinstelling

De beste manier om te leren is door te doen. Open Xcode en maak een nieuw project op basis van de Toepassing enkele weergave sjabloon.

Geef het project een naam bevestiging En instellen Taal naar Snel. Controleren Gebruik kerngegevens onderaan en klik volgende.

2. Gegevensmodel invullen

Open Validation.xcdatamodeld, maak een nieuwe entiteit aan en noem deze Gebruiker. Voeg de volgende kenmerken toe aan de gebruikersentiteit:

  • eerste van type Draad
  • laatste van type Draad
  • e-mail van type Draad
  • leeftijd van type Geheel getal 16

Maak een andere entiteit, noem deze Notitie, en voeg de volgende attributen toe aan de entiteit:

  • titel van type Draad
  • inhoud van type Draad
  • gemaakt bij van type Datum

Een gebruiker kan veel notities hebben en een notitie kan slechts bij één gebruiker horen. Dit betekent dat we een moeten toevoegen Te veel relatie met de Gebruiker entiteit met de Notitie entiteit als de bestemming. We moeten ook een toevoegen Tot een relatie met de Notitie entiteit met de Gebruiker entiteit als de bestemming en aantekeningen als de omgekeerde relatie. Zo ziet dat eruit in de datamodeleditor van Xcode.

3. Constraining Attributes

Gemeenschappelijke beperkingen kunnen worden gedefinieerd in het gegevensmodel. Laat me je laten zien hoe dit werkt. Open Validation.xcdatamodeld en selecteer de Gebruiker entiteit. Selecteer de e-mail attribuut en open de Gegevensmodelinspecteur aan de rechterkant.

In de bevestiging sectie, kunt u de minimum- en maximumlengte van het attribuut instellen. U kunt zelfs een reguliere expressie invoeren die de waarde van het attribuut moet evenaren om geldig te zijn. De Gegevensmodelinspecteur voegt ook de mogelijkheid toe om een ​​standaardwaarde in te stellen, wat handig is voor vereiste attributen.

Dit brengt ons bij de meest voor de hand liggende beperking voor attributen, hun optionaliteit. Door het vinkje te verwijderen uit de facultatief selectievakje bovenaan, u vertelt Core Data dat het attribuut een waarde moet hebben om geldig te zijn.

Als een object de validatie niet doorstaat, genereert Core Data een foutmelding als een opslagbewerking wordt uitgevoerd. Het spreekt voor zich dat Core Data het niet toestaat dat ongeldige objecten worden gepusht naar de permanente winkel van de applicatie.

Als u de leeftijd attribuut van de Gebruiker entiteit, zult u opmerken dat de bevestiging sectie ziet er iets anders uit. Omdat het leeftijd kenmerk is van het type Geheel getal 16, u kunt een minimum- en een maximumwaarde voor het attribuut instellen. U kunt ook een standaardwaarde definiëren.

Selecteer de gemaakt bij attribuut van de Notitie entiteit en open de Gegevensmodelinspecteur. Houd er rekening mee dat u een minimum- en een maximumdatum en een standaarddatum kunt opgeven.

Het belangrijkste nadeel van beperkingen in het datamodel is het gebrek aan dynamiek. Bijvoorbeeld als u een kenmerk van het type wilt beperken Datum naar waarden op basis van de huidige datum, dan moet u aangepaste validatie in code implementeren. We bekijken hoe dat later werkt.

4. Relaties beperken

Relaties verschillen niet erg van attributen. Ook zij kunnen worden beperkt. Een relatie kan optioneel of vereist zijn. De telling van a Te veel relatie kan worden beperkt tot een minimum en een maximale waarde. Selecteer de aantekeningen attribuut van de Gebruiker entiteit en open de Gegevensmodelinspecteur. De telling van de aantekeningen relatie kan een minimum- en een maximumwaarde hebben.

De mogelijkheid hebben om beperkingen toe te voegen aan een gegevensmodel is een krachtig concept en het is goed om te weten dat dit is ingebouwd in het Core Data-raamwerk.

5. Validatie van objecten

Selecteer de Gebruiker entiteit en markeer elk attribuut zoals vereist door het vinkje bij de facultatief checkbox in de Gegevensmodelinspecteur. Selecteer de leeftijd attribuut en stel de minimumwaarde in op 0 en de maximale waarde voor 120. Stel de standaardwaarde van het kenmerk in op 21.

Open AppDelegate.swift en update applicatie (_: didFinishLaunchingWithOptions :) zoals hieronder getoond. We maken een instantie van de Gebruiker entiteit en vul de kenmerken ervan. Merk op dat we de leeftijd attribuut aan een waarde die groter is dan de maximumwaarde die we in het gegevensmodel hebben opgegeven. We kunnen het beheerde object vragen of het geldig is voor invoegen in de permanente winkel door op te roepen validateForInsert (). Omdat deze methode gooit, pakken we het in a doe-vangst uitspraak.

toepassing func (toepassing: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool if let entity = NSEntityDescription.entityForName ("User", inManagedObjectContext: self.managedObjectContext) // Creëer beheerd object laat gebruiker = NSManagedObject ( entity: entity, insertIntoManagedObjectContext: self.managedObjectContext) // Beheerd beheerd object user.setValue (140, forKey: "age") user.setValue ("Bart", forKey: "first") user.setValue ("Jacobs", forKey : "laatste") user.setValue ("[email protected]", forKey: "email") do try user.validateForInsert () catch let validationError = error as NSError print (validationError) return true

Als u de toepassing in de simulator of op een fysiek apparaat uitvoert, ziet u de volgende fout in de console.

Error Domain = NSCocoaErrorDomain Code = 1610 "De bewerking kan niet worden voltooid. (Cocoa error 1610.)" UserInfo = NSValidationErrorObject = (entiteit: Gebruiker; id: 0x7fef63613eb0  ; gegevens: age = 140; email = "[email protected]"; eerste = Bart; last = Jacobs; opmerkingen = (); ), NSValidationErrorValue = 140, NSValidationErrorKey = age, NSLocalizedDescription = De bewerking kan niet worden voltooid. (Cocoa-fout 1610.)

De fout is vrij duidelijk over wat er mis is met het beheerde object. Hoewel de gelokaliseerde beschrijving een beetje vaag is, geeft de fout de waarde van de leeftijd kenmerk voldoet niet aan de beperkingen die we in het gegevensmodel hebben gedefinieerd.

Het is mogelijk dat er meerdere validatiefouten zijn gegenereerd tijdens de validatie. Ik zal je laten zien hoe dat eruit ziet. Als u een migratieprobleem wilt voorkomen, verwijdert u de toepassing uit de simulator. Herlees het gegevensmodel en selecteer de laatste attribuut van de Gebruiker entiteit. Open de Gegevensmodelinspecteur aan de rechterkant en verwijder het vinkje facultatief om het attribuut verplicht te maken.

Open AppDelegate.swift en verwijder de regel waarin we de achternaam van de Gebruiker record.

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

Start de applicatie opnieuw en inspecteer om uit te voeren in de console.

Error Domain = NSCocoaErrorDomain Code = 1560 "(null)" UserInfo = NSDetailedErrors = ("Error Domain = NSCocoaErrorDomain Code = 1610 \" De bewerking kan niet worden voltooid. (Cocoa-fout 1610.) \ "UserInfo = NSValidationErrorObject = (entiteit: Gebruiker; id: 0x7feab84196f0  ; data: \ n age = 140; \ n email = \ "[email protected] \"; \ n first = Bart; \ n last = nil; \ n notes = (\ n); \ n), NSValidationErrorValue = 140, NSValidationErrorKey = age, NSLocalizedDescription = De bewerking kan niet worden voltooid. (Cocoa error 1610.) "," Error Domain = NSCocoaErrorDomain Code = 1570 \ "De bewerking kan niet worden voltooid. (Cocoa error 1570.) \" UserInfo = NSValidationErrorKey = last, NSLocalizedDescription = De bewerking kan niet worden uitgevoerd voltooid. (Cocoa error 1570.), NSValidationErrorObject = (entiteit: Gebruiker; id: 0x7feab84196f0  ; data: \ n age = 140; \ n email = \ "[email protected] \"; \ n first = Bart; \ n last = nil; \ n notes = (\ n); \ n) " )

De gebruikers informatie woordenboek van het foutobject bevat een reeks fouten die ons informeren wat er tijdens de validatie fout is gegaan. Begrijp dat dezelfde fouten worden gegenereerd als u een beheerd object probeert te redden dat de validatie niet doorstaat.

Conclusie

Gegevensvalidatie is een belangrijk aspect van gegevenspersistentie. U moet ervoor zorgen dat de gegevens die u invoegt in de permanente winkel geldig zijn. Met andere woorden, de gegevens die u invoegt, moeten voldoen aan de vereisten die u in het gegevensmodel en uw toepassingscode definieert.

Volgende week laat ik je zien hoe je complexere validatieregels in code kunt maken. Hoewel deze aanpak wat meer werk vereist, zijn validatieregels in code flexibeler en krachtiger.