Core data og Swift: kjernedata Stack
19
Del
7
Del
Dette Cyber Monday Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie kalt kjernedata og Swift.Core Data- og Swift. Datamodell
Innledning
The Core data rammeverket har eksistert i mange år. Det er brukt i tusenvis av søknader og av millioner av mennesker, både på iOS og OS X. Core-data blir vedlikeholdt av Apple og er svært godt dokumentert. Det er en moden rammeverk som har bevist sin verdi over og over.
Selv om kjernedata er veldig avhengig av Objective-C runtime og integrerer pent med Core Foundation rammeverk, kan du enkelt bruke rammeverket i dine Swift prosjekter . Resultatet er en enkel å bruke rammeverk for å håndtere et objekt graf som er elegant å bruke og utrolig effektiv i form av minnebruk.
1. Forutsetninger
The Core data rammeverket er ikke vanskelig i seg selv, men hvis du er ny på iOS eller OS X utvikling, så anbefaler jeg at du først gå gjennom vår serie om iOS utvikling. Den lærer deg det grunnleggende av iOS utvikling, og på slutten av serien, vil du ha nok kunnskap til å ta på seg mer komplekse emner, for eksempel kjernedata.
Som jeg sa, Core data isn 't så komplisert eller vanskelig å plukke opp som de fleste utviklerne tror. Men jeg har lært at et solid fundament er avgjørende for å få fart på karrieren med kjernedata. Du må ha en riktig forståelse av kjernedata API for å unngå dårlige rutiner og sørge for at du ikke får problemer ved hjelp av rammeverket.
Hver komponent av Core data rammen har et bestemt formål og funksjon. Hvis du prøver å bruke Core data på en måte det ikke var designet for, vil du uunngåelig ende opp sliter med rammen.
Det jeg dekke i denne serien på kjernedata er aktuelt for iOS 7+ og OS X 10.10+, men vil fokuset være på iOS. I denne serien vil jeg jobbe med Xcode 7.1 og Swift 2.1. Hvis du foretrekker Objective-C, så jeg anbefaler å lese min tidligere serie på grunndata rammeverket.
2. Læringskurven
The Core data rammeverket kan virke skremmende i starten, men API er intuitivt og konsis når du forstår hvordan de ulike bitene i puslespillet passer sammen. Og det er nettopp derfor de fleste utviklere får problemer ved hjelp av rammeverket. De prøver å bruke Core data før de har sett at velkjente puslespill, de vet ikke hvordan bitene i puslespillet passer sammen, og forholder seg til hverandre.
I denne artikkelen vil jeg hjelpe deg å bli kjent med Kjernedata stabelen
. Når du forstår de sentrale aktørene i kjernedata stabelen, vil rammen føle mindre skremmende, og du vil selv begynne å nyte og sette pris på rammeverket er godt utformet API.
I motsetning til rammeverk som UIKit, som du kan bruke uten å forstå rammene i sin helhet, Core data krever en riktig forståelse av sine byggeklosser. Det er viktig å sette av litt tid til å bli kjent med rammeverk, som vi vil gjøre i denne opplæringen.
3. Hva er kjernedata?
Utviklere ny til Core data rammeverket ofte forveksler den med og forventer at det skal fungere som en database. Hvis det er én ting jeg håper du vil huske fra denne serien, er det at kjernedata er ikke en database, og du bør ikke forvente at det skal fungere som en.
Hva er kjernedata hvis det isn ' t en database? Kjernen data er modellen laget av programmet i videste forstand mulig. Det er det Model
i Model-View-Controller
mønster som gjennomsyrer iOS SDK.
Kjerne data er ikke databasen av søknaden din er heller ikke en API for vedvarende data til en database. Kjernen Data er et rammeverk som forvalter et objekt grafen. Det er så enkelt som det. Kjernen data kan
vedvare at objektet grafen ved å skrive det på harddisken, men det er ikke det primære målet av rammeverket.
4. Kjernen data Stack
Som jeg nevnte tidligere, er kjernen data stabelen midt i kjernen av data. Det er en samling av objekter som gjør kjernedata tick. De sentrale objekter av stabelen er klarte objektmodellen
, vedvarende butikken koordinator
, og en eller flere administrerte objekt sammenhenger
. La oss starte med å ta en rask titt på hver komponent.
NSManagedObjectModel
De klarte objektmodellen representerer datamodellen av søknaden. Selv om kjernedata er ikke en database, kan du sammenligne klarte objektmodellen til skjemaet fra en database, det vil si den inneholder informasjon om modeller eller enheter av objektet grafen, hvilke attributter de har, og hvordan de forholder seg til hverandre.
NSManagedObjectModel objekt vet om datamodell ved å laste en eller flere data modellfiler i løpet av sin initialisering. Vi vil ta en titt på hvordan dette fungerer i en liten stund.
NSPersistentStoreCoordinator
Som navnet indikerer, vedvarer NSPersistentStoreCoordinator objektet data til disk og sikrer vedvarende butikken (s ) og datamodellen er kompatible. Det formidler mellom den vedvarende butikken (e) og klarte objekt kontekst (s), og også tar seg av lasting og caching av data. Det er riktig. Kjernen data har caching bygget i.
Den vedvarende butikken koordinator er dirigent for kjernedata orkester. Til tross for sin viktige rolle i kjernedata stabelen, vil du sjelden bruker det direkte.
NSManagedObjectContext
NSManagedObjectContext objekt forvalter en samling av modell objekter, forekomster av NSManagedObject klassen. Det er mulig for en applikasjon å ha flere administrerte objekt sammenhenger. Hver klarte objekt sammenheng er støttet av en vedvarende butikken koordinator.
Du kan se en administrert objekt sammenheng som en arbeidsbenk der du arbeide med modell stedene. Du laster dem, du manipulere dem, og lagre dem på at arbeidsbenken. Lasting og lagring er formidlet av den vedvarende butikken koordinator. Du kan ha flere arbeidsbenker, noe som er nyttig hvis søknaden er multithreaded, for eksempel.
Mens en administrert objektmodell og vedvarende butikken koordinator kan deles på tvers av tråder, bør aldri nås administrerte objekt sammenhenger fra en tråd annerledes enn den de ble opprettet på. Vi vil diskutere multithreading i mer detalj senere i denne serien.
5. Utforske kjernedata Stack
Trinn 1: Prosjektoppsett
La oss utforske Core data stable nærmere ved å ta en titt på et eksempel. Opprett et nytt prosjekt i Xcode 7 ved å velge New > Prosjekt ...
fra Fil
menyen. Velg Enkel visning Application
mal fra listen over iOS > Søknad
rammer på venstre.
Navn prosjektet kjernedata
, satt språk til Swift, Enheter
til iPhone
, og sjekk avmerkingsboksen Bruk kjernedata
. Fortell Xcode hvor du ønsker å lagre prosjektfiler og klikk på Opprett
Trinn 2:. Oversikt
Som standard setter Apple kode relatert til Core data i programmets delegat klasse, den AppDelegate klassen i vårt eksempel. Åpne AppDelegate.swift og la oss begynne å utforske gjennomføringen av AppDelegate klassen.
På toppen av AppDelegate.swift, skal du se en import statement for Core data rammeverket
. Import UIKitimport CoreData
Den AppDelegate klassen videre inneholder fire late lagret egenskaper:
applicationDocumentsDirectory av type NSURL
managedObjectModel av type NSManagedObjectModel
managedObjectContext av type NSManagedObjectContext
persistentStoreCoordinator av type NSPersistentStoreCoordinator
Den første eiendom, applicationDocumentsDirectory, er ingenting mer enn en hjelper for å få tilgang til dokumenter katalogen for programmet. Gjennomføringen er ganske enkelt som du kan se nedenfor. Den NSFileManagers klassen brukes til å hente plasseringen av dokumenter katalogen programmets
lat Var applicationDocumentsDirectory. NSURL = {la webadresser = NSFileManager.defaultManager () URLsForDirectory (.DocumentDirectory, inDomains: .UserDomainMask). Returnere webadresser [urls.count -1]} ()
De resterende tre late lagret egenskaper er mer interessant og direkte relatert til Core data rammeverket. Vi først skal utforske managedObjectContext eiendom
Trinn 3:. Managed Object Context
Klassen du bruker oftest, bortsett fra NSManagedObject, når vi samhandler med kjernedata er NSManagedObjectContext.
lat Var managedObjectContext: NSManagedObjectContext = {la koordinator = self.persistentStoreCoordinator Var managedObjectContext = NSManagedObjectContext (concurrencyType: .MainQueueConcurrencyType) managedObjectContext.persistentStoreCoordinator = koordinator returnere managedObjectContext} ()
Merk at NSManagedObjectContext objektet er instansiert og konfigurert i en nedleggelse. I nedleggelse, må vi først få en henvisning til den vedvarende butikken koordinator. Vi deretter instantiate NSManagedObjectContext, passerer i .MainQueueConcurrencyType som første argument. Du vil lære mer om samtidighet typer senere i denne serien. Ved bestått i .MainQueueConcurrencyType, vi viser at greid objektet sammenheng vil gjøre sitt arbeid med køen av hovedtråden.
Før vi returnere klarte objektet konteksten, setter vi objektets persistentStoreCoordinator eiendom. Uten en vedvarende butikken koordinator, er en styrt objekt sammenheng ubrukelig. Det var ikke så vanskelig. Var det?
I sammendraget, forvalter klarte objektet sammenheng en samling av modell objekter, forekomster av NSManagedObject klasse, og holder en referanse til et vedvarende butikken koordinator. Ha dette i bakhodet mens du leser resten av denne artikkelen
Trinn 4:. Vedvarende Butikk Koordinator
Som vi så et øyeblikk siden, persistentStoreCoordinator Eiendommen er tilgjengelig under konfigureringen av den administrerte objektet sammenheng . Ta en titt på gjennomføringen av persistentStoreCoordinator eiendom, men ikke la det skremme deg. Det er faktisk ikke så komplisert
lat Var persistentStoreCoordinator. NSPersistentStoreCoordinator = {la koordinator = NSPersistentStoreCoordinator (managedObjectModel: self.managedObjectModel) la url = self.applicationDocumentsDirectory.URLByAppendingPathComponent ("SingleViewCoreData.sqlite") Var failureReason = "Det oppstod en feil opprette eller laste lagrede data programmets. " do {prøve coordinator.addPersistentStoreWithType (NSSQLiteStoreType, konfigurasjon: null, URL: url, alternativer: null)} catch {var dict = [String: AnyObject] () dict [NSLocalizedDescriptionKey] = "Kunne ikke initial lagrede data programmets" dict [ ,,,0],NSLocalizedFailureReasonErrorKey] = failureReason dict [NSUnderlyingErrorKey] = feil som NSError la wrappedError = NSError (domene: "YOUR_ERROR_DOMAIN", kode: 9999, Userinfo: dict) NSLog ("Uløste error \\ (wrappedError), \\ (wrappedError.userInfo)") abort ()} avkastning koordinator} ()
Du vil nesten alltid ønsker å lagre Kjerne Datas objekt grafen til disk og Apples implementering av persistentStoreCoordinator eiendommen bruker en SQLite database for å oppnå dette. Dette er et vanlig scenario for Kjerne-dataapplikasjoner.
I nedleggelsen av persistentStoreCoordinator eiendom, begynner vi med å Instantiating en forekomst av NSPersistentStoreCoordinator klassen, passerer i administrerte objektmodellen som et argument. Vi vil utforske managedObjectModel eiendom i et øyeblikk.
Som du kan se, er lett å skape en NSPersistentStoreCoordinator objekt. Men det er en vedvarende butikk koordinator til liten nytte hvis det ikke har noen vedvarende butikker å administrere. I resten av nedleggelsen, forsøker vi å laste en vedvarende butikken og legge den til den vedvarende butikken koordinator.
Vi starter ved å angi plasseringen av butikken på disken, ved hjelp av applicationDocumentsDirectory egenskapen vi så tidligere. Resultatet, en NSURL objekt, er gått til addPersistentStoreWithType (_: konfigurasjon: URL: alternativer :) metoden i NSPersistentStoreCoordinator klassen. Som metodens navnet indikerer, legger metoden et vedvarende butikk til den vedvarende butikken koordinator. Metoden aksepterer fire argumenter.
Vi først spesifisere butikken type, NSSQLiteStoreType i dette eksempelet. Kjernen data støtter også binære butikker (NSBinaryStoreType) og en in-memory butikken (NSInMemoryStoreType).
Det andre argumentet forteller kjernen data hvilken konfigurasjon som skal brukes for vedvarende butikken. Vi passerer i null, som forteller kjernedata for å bruke standardkonfigurasjonen. Det tredje argumentet er plasseringen av butikken, som er lagret i url.
Den fjerde argument er en ordbok over alternativer som lar oss endre oppførselen til den vedvarende butikken. Vi vil se dette aspektet senere i denne serien og passere i null for nå
Fordi addPersistentStoreWithType (_:. Konfigurasjon: URL: alternativer :) er en kaste metode, pakk vi metodekallet i en gjør-fangst uttalelse. Hvis ingen feil dukker opp, returnerer denne metoden en NSPersistentStore objekt. Vi vil ikke holde en referanse til den vedvarende butikken, fordi vi ikke trenger å samhandle med det når det er lagt til den vedvarende butikken koordinator.
Hvis du legger den vedvarende butikken mislykkes, skjønt, betyr det at det er et problem med den vedvarende butikken på programmet, og vi må ta de nødvendige skritt for å løse problemet. Når dette skjer og hvorfor det skjer er gjenstand for en fremtidig avdrag av denne serien.
I fangsten klausulen, vi logge eventuelle feil på konsollen og avbryte påberopes. Du bør aldri kalle abort i et produksjonsmiljø, fordi det krasjer programmet. Vi vil gjennomføre en mindre aggressiv løsning senere i denne serien
Trinn 5:. Managed Object Model
Den tredje og siste brikken i puslespillet er forvaltet objektmodellen. La oss ta en titt på gjennomføringen av managedObjectModel eiendom
lat Var managedObjectModel. NSManagedObjectModel = {la modelURL = NSBundle.mainBundle () URLForResource ("Core_Data", withExtension: "momd").! returnere NSManagedObjectModel (contentsOfURL: modelURL)!} ()
Gjennomføringen er veldig enkelt. Vi lagrer plasseringen av modellen programmets i modelURL og bruke den under oppretting av den administrerte objektmodellen.
Fordi initializer, init (contentsOfURL :), returnerer en valgfri, tvinger vi pakke ut det før du returnerer resultatet . Er ikke det farlig? Ja og nei. Det er ikke anbefalt å tvinge Pakk optionals. Men å unnlate å initialisere klarte objektmodellen innebærer at søknaden ikke er i stand til å finne datamodellen i programmets bunten. Hvis det skjer, da noe gikk galt som er utenfor kontroll av søknaden.
På dette punktet, er du sannsynligvis lurer på hva som modellen er modelURL peker til og hva filen med .momd utvidelsen er . For å besvare disse spørsmålene, må vi finne ut hva annet Xcode har skapt for oss i løpet av prosjektets oppsett.
Prosjekt Navigator
til venstre, skal du se en fil som heter Core_Data.xcdatamodeld
. Dette er datamodell av søknaden som er kompilert til en .momd fil. Det er den .momd filen som den forvaltes objektmodellen bruker til å lage datamodell for programmet.
Det er mulig å ha flere data modellfiler. Den NSManagedObjectModel klassen er fullt i stand til å slå sammen flere datamodeller til ett, som er en av de mer kraftige og avanserte funksjoner av grunndata.
The Core data rammeverket støtter også datamodell versjone samt vandringer. Dette sikrer at dataene lagret i den varige lager (e) ikke blir ødelagt. Vi vil dekke versjons og vandringer senere i denne serien.
Datamodellen fil i prosjektet er tom for øyeblikket, noe som betyr at din datamodell inneholder ingen enheter. Vi vil rette opp dette i neste tutorial som vil fokusere utelukkende på datamodellen.
6. Putting It All Together
Før vi bryte opp denne artikkelen, vil jeg gjerne vise deg et diagram som illustrerer de tre komponentene i kjernedata stabelen.
Diagrammet ovenfor er en visuell representasjon av hva vi utforsket i eksempelet prosjekt for et øyeblikk siden. Den NSPersistentStoreCoordinator objektet er hjernen i programmets kjernedata stabelen. Den snakker til en eller flere vedvarende butikker og sørger for at data blir lagret, lastet, og skjulested.
Den vedvarende butikken koordinator vet om datamodellen, skjema av objektet grafen hvis du vil, gjennom NSManagedObjectModel objekt . Den klarte objektmodellen skaper datamodell for programmet fra en eller flere .momd filer, binære representasjoner av datamodellen.
Sist men ikke minst, tilgang til applikasjonen objektet graf gjennom en eller flere forekomster av NSManagedObjectContext klasse . En administrert objekt sammenheng vet om datamodellen gjennom vedvarende butikken koordinator, men det vet ikke og holde en referanse til den administrerte objektmodellen. Det er ikke behov for en slik henvisning.
De klarte objekt sammenheng ber vedvarende koordinator for data, og forteller det til å lagre data når det er nødvendig. Dette er gjort for deg av kjernedata rammeverket og søknaden sjelden behov for å snakke med den vedvarende butikken koordinator direkte.
Konklusjon
I denne artikkelen vi dekket de viktigste spillerne i Core- data stabelen, den vedvarende butikken koordinator, den klarte objektmodellen, og den klarte objekt sammenheng. Pass på at du forstår hvilken rolle hver komponent og, enda viktigere, hvordan de jobber sammen for å lage kjernedata gjøre sin magi.
I neste utgaven av denne serien, dykke vi inn i datamodellen. Vi tar en titt på datamodellen redaktør i Xcode og vi skaper noen enheter, attributter og relasjoner.