In deze Core Data tutorial bouwen we een app waarin de belangrijkste onderdelen van Core Data aan bod komen. Deze aflevering besteden we aandacht aan het Core Data datamodel.
Deel 1 uit deze tutorial vind je hier.
De basis van elke Core Data-app is het datamodel, in Core Data-termen ook wel object graph genoemd. De gegevens die onze app moet opslaan, worden bewaard volgens zo’n datamodel: dat datamodel bevat de structuur van de gegevens.
Heb je wel eens met een database, zoals mySQL, gewerkt? Dan ken je wellicht de term schema: de beschrijving van de structuur van de database. Het datamodel is het ‘schema’ van de Core Data-database.
In deze nieuwe LIVE Clinic over Core Data leer je in één dag hoe je zelf Core Data in je apps kunt gebruiken. Gewoon thuis, vanachter je Mac!
Meer informatieEen Core Data datamodel beschrijft de structuur die moet worden gebruikt om gegevens op te slaan. De twee belangrijkste onderdelen zijn entities en attributes.
In Core Data heeft elk datamodel één of meer entities, ‘entiteiten’. Een entity beschrijft een verzameling (bij elkaar horende) gegevens. Een voorbeeld: als we een serie adressen in een Core Data-app zouden willen bijhouden, wordt elk van die adressen bewaard zoals in de entity staat beschreven.
In database-terminologie wordt een entity een tabel genoemd.
Een entity heeft één of meer attributes, ‘kenmerken’. Onze ‘adres’-entity kan bijvoorbeeld een kenmerk voor de straatnaam hebben, een ander kenmerk voor het huisnummer, eentje voor de postcode enzovoort. Kenmerken hebben een ‘datatype’, zoals Int64
, String
en Date
.
Een attribute in Core Data kun je vergelijken met een tabel-kolom uit een database.
Samenvattend: door in het datamodel entities te maken en elke entity één of meer attributes te geven, ontwerp je de structuur waarin je gegevens kunnen worden opgeslagen.
Als je wel eens met databases hebt gewerkt, kan het volgende overzicht je helpen:
Xcode heeft een aparte editor om datamodellen te kunnen maken: de Datamodel Editor. Deze editor verschijnt automatisch als je een bestand met de extensie .xcdatamodeld
opent.
We bouwen verder aan de app waarmee we in het vorige artikel zijn begonnen:
Klik hier om naar het vorige artikel te gaan, of klik hier om de Xcode-bestanden van de app te downloaden.
Selecteer, in de File Navigator, het bestand Notities.xcdatamodeld
.
De Editor toont nu het (op dit moment nog lege) datamodel van onze app:
We hebben één entiteit nodig om de structuur van een notitie kunnen beschrijven: Notitie
. Klik op het Add Entity-icoon:
Xcode voegt meteen een entiteit toe en noemt hem Entity (let op de hoofdletter):
Klik één keer op de naam Entity
en verander hem in Notitie
. Druk daarna op Enter.
Namen van entities beginnen altijd met een hoofdletter. De reden hiervoor wordt dadelijk al duidelijk: Xcode kan van entities automatisch classes maken.
Elke notitie in onze app heeft een titel en een datum. Nu we onze Notitie
-entity hebben, kunnen we voor zowel de titel als de datum een kenmerk (attribute) toevoegen.
Klik, in het Attributes-gedeelte, op het + icoon:
Xcode voegt meteen een kenmerk toe:
Typ in plaats van attribute de tekst titel
(met een kleine letter) Kies bij Type voor String
:
Nu we het titel
-kenmerk aan de entity hebben toegevoegd, doen we datzelfde met het tweede kenmerk, datum
. Kies bij type voor Date
:
Namen van kenmerken (attributes) beginnen altijd met een kleine letter. Je ziet dadelijk zie je waarom: Xcode kan automatisch een class maken op basis van de entity, met als properties alle attributen van die entity.
We zijn klaar met onze entity. Hij bevat de twee attributen die we zojuist hebben toegevoegd:
Eén van de fraaiste eigenschappen van Core Data is dat de ‘onderliggende database’ min of meer verborgen blijft. Je hoeft dus niet met tabellen en records te werken, maar je gebruikt classes en objecten.
Xcode kan voor onze entity in het Core Data datamodel automatisch een class definiëren, met de naam van de entiteit. Alle kenmerken (attributes) in onze class worden properties in die class. In ons geval kan Xcode dus een Notitie
-class maken, met de properties .titel
en .datum
. Straks kunnen we met behulp van die Notitie
-class heel gemakkelijk notities maken, bewaren en opvragen.
Selecteer nogmaals de Notitie
-entiteit:
Kies, in het Utilities-paneel aan de rechterkant, de Data Model Inspector (of druk op (⌘⌥ 3). In het tweede gedeelte, Class, zie je de optie Codegen (‘code generation’). De tekst Class Definition erachter geeft aan dat Xcode automatisch een class maakt. Dit gebeurt onzichtbaar en op de achtergrond, zonder dat je daar verder iets voor hoeft te doen.
De Notitie
-class die door Xcode wordt gemaakt, is een subclass van NSManagedObject
.
Dergelijke, door Xcode automatisch op basis van het Core Data datamodel gemaakte classes worden niet in de File Navigator van Xcode getoond. Ze worden door Xcode opgeslagen in de Derived Data-map voor je app. Ga, met de Finder, naar ~/Bibliotheek/Developer/Xcode/Derived Data
en zoek de map voor je app. In die map vind je, diep verborgen, de toegevoegde class:
Deze classes zijn niet voor niets verborgen; het is niet de bedoeling dat je ze wijzigt. Xcode doet dat namelijk automatisch, telkens als je iets in het Core Data datamodel verandert.
De inhoud van de door Xcode gemaakte class-definitie ziet er als volgt uit:
1 2 3 4 5 6 7 8 |
import Foundation import CoreData @objc(Notitie) public class Notitie: NSManagedObject { } |
Ook maakt Xcode een extensie voor deze class aan:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
import Foundation import CoreData extension Notitie { @nonobjc public class func fetchRequest() -> NSFetchRequest<Notitie> { return NSFetchRequest<Notitie>(entityName: "Notitie") } @NSManaged public var datum: NSDate? @NSManaged public var titel: String? } |
Het trefwoord
@NSManaged
is geen datatype, maar maakt het voor iOS mogelijk om alles ‘op de achtergrond’ te beheren: iOS legt een ‘brug’ tussen deNotitie
-class en de bijbehorende Core Data-class, een zogenaamdeNSManagedObject
. DezeNSManagedObject
-class is, zoals we in de volgende artikelen zullen zien, buitengewoon handig.
In dit artikel hebben we het Core Data datamodel van onze app gemaakt. Het heeft één entiteit, Model
. Deze entiteit bevat twee kenmerken, titel
en datum
. Op basis van deze entiteit kunnen we nu objecten maken die we door Core Data kunnen laten opslaan. Dat doen we in het volgende artikel uit deze serie.
LET OP: je kunt deze app nu niet bouwen en uitvoeren! De reden is dat er nu twee Notitie-classes zijn: de class die we in de vorige aflevering hebben gemaakt en de class die zojuist door Xcode is gegenereerd. Als je probeert om de app toch te starten, krijg je een indrukwekkende reeks foutmeldingen:
Deze foutmeldingen verhelpen we in het volgende artikel uit deze serie.
Klik hier om de Xcode-bestanden van dit artikel te downloaden.
In deze nieuwe LIVE Clinic over Core Data leer je in één dag hoe je zelf Core Data in je apps kunt gebruiken. Gewoon thuis, vanachter je Mac!
Meer informatie