I denne veiledningen vil jeg vise deg hvordan du bruker en kraftig, men likevel elegant, databaseløsning for enhetene dine til iOS-appene dine: Realm Mobile Database. Et alternativ til Apple Core Data eller SQLite med objektrelasjonell kartlegging (ORM), Realm Mobile Database, gir utviklere en enklere og mer naturlig måte å lagre og spørre data på..
Fakturert som en sann objektdatabase, skiller Realm seg fra andre lignende biblioteker ved å behandle dataobjekter som levende gjenstander-noe som betyr at objekter automatisk oppdateres. De reagerer responsivt på endringer og er lette å vedvare. Enda bedre, du har ikke den bratte lærekurven som du ville med Core Data eller SQLite scripting. I stedet kan du jobbe på en virkelig objektorientert måte. Realm Mobile Database har også vært åpen fra 2016, og er gratis tilgjengelig for utviklere.
I tillegg til Realm Mobile Database, tilbyr selskapet også Realm Mobile Platform, dets flaggskip PAAS som et supplement til Realm Mobile Database med en server-side løsning.
Realm Mobile Platform, utvider den kjerne med realtids datasynkronisering og hendelseshåndtering på server siden, alle sømløst forbundet med appene. Utviklere benytter plattformen for å bygge applikasjoner med kraftig funksjonalitet som messaging, samarbeid og offline-førstegenskaper. Plattformen er også ideell for mobilisering av eksisterende APIer, noe som gjør det enkelt å bygge svært responsive og engasjerende apps knyttet til eldre systemer og tjenester. (Realm.io)
Så Realm Mobile Platform fungerer på serversiden på samme sømløse måte som Realm Mobile Database, som gir automatisk datasynkronisering og hendelseshåndtering mellom klient og server, og i prosessen abstraherer kompleksiteten som oppstår når det gjelder data synkronisering. Realm Mobile Platform er utenfor omfanget av denne opplæringen, men jeg kommer tilbake til det i et fremtidig innlegg.
Utover å spare utviklere hodepine og bratt lærekurve av Core Data, gir Realm Mobile Database særegne fordeler rett ut av esken..
Prestasjonsmessig har Realm Mobile Database vist seg å kjøre spørringer og synkronisere objekter betydelig raskere enn Core Data, og det er ikke et problem å få tilgang til dataene samtidig. Det vil si at flere kilder kan få tilgang til det samme objektet uten at det er nødvendig å administrere låser eller bekymre seg for inkonsekvenser for data.
Realm Mobile Database tilbyr sine egne krypteringstjenester for å beskytte databaser på disk ved hjelp av AES-256 + SHA2 gjennom 64-byte kryptering.
Dette gjør at alle dataene som er lagret på disken, er kryptert og dekryptert med AES-256 etter behov, og bekreftet med en SHA-2 HMAC. Den samme krypteringsnøkkelen må leveres hver gang du oppnår en Realm-forekomst.
I motsetning til Core Data er Realm Mobile Database virkelig kryssplattform, som støtter iOS, Android, JavaScript-webprogrammer og Xamarin.
På grunn av måten de levende gjenstandene jobber på, er du i stand til å koble opp UI-elementene til datamodellene, og brukergrensesnittet ditt vil oppdatere etter hvert som dataene endres! Det er ingen komplisert synkroniseringskode eller ledningslogikk som trengs, som du ville ha med Core Data.
Når kombinert med Realm Mobile Platform og Realm Object Server, vil utviklere få den ekstra fordelen ved å synkronisere dataene til skyen ved å bare sette URL for Realm Object-adressen.
Selv ved å bruke Realm Mobile Platform, trenger du ikke å bekymre deg for avbrutte tilkoblinger, da Realm har innebygde offlinefunksjoner og vil køen endres data for å bli sendt til serveren.
Realm har mange fremstående kunder som har åpenbart vedtatt Realm Mobile Database, inkludert Netflix og Starbucks.
Selvfølgelig er Realm Mobile Database ikke den eneste applagringsløsningen. Jeg nevnte allerede Apples egen Core Data, og mens det iboende er mer komplisert å lære, betyr det at det blir Apple de facto database løsning for mange iOS utviklere, og vil fortsette å ha et stort fellesskap av utviklere og støttemateriale.
En løsning som ligner på Realm Mobile Database er Googles Firebase, selv om dette er en kombinert løsning på kundesiden og server-siden. Firebase er like lett å bruke, og det er gratis å komme i gang med, men kostnadene skaleres ettersom bruken din gjør. En ulempe med Firebase er at du er tett koblet til plattformen, mens med Realm du er fri til å bruke din egen back-end-eller ingen back-end i det hele tatt!
Denne opplæringen forutsetter at du har arbeidskunnskap om Swift, men det er ikke behov for kjernedata eller tidligere databasekunnskaper.
I tillegg til Realm bruker vi følgende deler av iOS:
Ved slutten av denne opplæringen har du utviklet en enkel oppgave som er skrevet i Swift og benytter Realm Mobile Database til å vedvare data lokalt. Du kommer til å skape en fullt fungerende Realm-powered-til-gjør-app, og underveis lærer du følgende begreper:
Du kan laste ned den komplette kildekoden fra opplæringen GitHub repo.
Ok, la oss begynne å lage vår Realm-app: RealmDo. Vi skal lage et nytt Xcode-prosjekt, så fortsett og opprett en Master-Detail-applikasjon.
Deretter må du gjøre det nå, hvis du ikke har installert CocoaPods på maskinen din. Så hopp inn i terminal og skriv inn følgende:
$ sudo perle installere cocoapods
Du bør da få en bekreftelse på at cocoapods faktisk er installert. Mens du fortsatt er i terminalen, naviger til Xcode-prosjektet du nettopp har opprettet, og skriv inn følgende, for å initialisere en ny Podfile:
$ pod init
Du bør se en ny fil som heter Podfile plassert i rotkatalogen av prosjektet ditt. Denne filen inneholder i utgangspunktet bibliotekene vi vil bruke i vårt prosjekt. Du kan se den offisielle CocoaPods dokumentasjonen for mer informasjon om hvordan Podfiles fungerer.
Deretter må vi legge til cocoapod-biblioteket for Realm, så åpne Podfile i et tekstredigeringsprogram, og legg til følgende under # Pods for RealmDo
:
... bruk dynamiske rammer use_frameworks! # Pods for RealmDo pod 'RealmSwift' mål 'RealmDoTests' gjør ...
Lagre filen, avslutt og skriv:pod installasjon
Etter at CocoaPods er ferdig med å installere biblioteket, vil det be oss om å lukke vårt Xcode-prosjekt og åpne arbeidsområdet. Gjør det, og vi er klare til å fortsette med koding. Vi starter med AppDelegate
.
I vår AppDelegate
Vi skal importere Realm biblioteket, så legg til følgende til AppDelegate.swift fil:
importere UIKit import RealmSwift @UIApplicationMain klasse AppDelegate: ...
La klassen være som for nå, så vi kan vende fokuset til modellobjektet.
Definere modeller i Realm er død enkel; du lager bare en logisk modellklasse. I vårt prosjekt skal vi lagre påminnelser, så la oss lage en klasse som heter Reminder.swift, med følgende kode:
importer RealmSwift klasse Påminnelse: Objekt dynamisk varnavn = "" dynamisk var gjort = false
For denne opplæringen trenger vi bare dette påminnelse
modell, så vi er alle ferdige! Det er så enkelt, og instantiating en modell er like enkelt som vi vil finne ut senere.
Nå fokuserer vi vår oppmerksomhet på visningskontrollerne, men før vi går til MasterViewController.swift klasse, la oss åpne opp Main.storyboard og legg til en strekknapp øverst til høyre, kalt Legg til, som vist under:
Prosjektet ble initialisert av Xcode med datakilden og delegaten som var koblet til visningskontrolleren, så alt vi trenger å gjøre er å legge til knappen vi nettopp har opprettet til visningskontrolleren som en IBOutlet
. Hold og dra fra knappen til visningsregulatoren i split-view-modus for å generere linken.
Nå går det videre til MasterViewController.swift fil, erklærer vi de variablene vi skal trenge, som skal se ut som følgende:
klasse MasterViewController: UITableViewController var realm: Realm! // (1) @IBOutlet svak var addButton: UIBarButtonItem! var påminnelserListe: Resultater// (2) få return realm.objects (Reminder.self) tilsidesatte func viewDidLoad () // (3) super.viewDidLoad () // Gjør noe ekstra oppsett etter at du har lastet opp visningen, vanligvis fra en nib . rike = prøv! Realm () ...
Først, på linje (1), erklærer vi Realm-variabelen som vi skal referere for å komme til vår datastore. Da laver vi lazy-lasten remindersList
kaller Realm-objektene for en liste over alle påminnelsesobjekter. Til slutt forklarer vi Realm-variabelen som vi erklærte ved starten. Ingenting så komplisert hittil!
Deretter satte vi opp vår Tableview
delegere og datakilde metoder, som følger:
overstyr func numberOfSections (i tableView: UITableView) -> Int return 1 tilsidesatte func tableView (_ tableView: UITableView, numberOfRowsInSection seksjon: Int) -> Int // (4) returnerer remindersList.count overstyr func tableView : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell la cellen = tableView.dequeueReusableCell (withIdentifier: "Cell", for: indexPath) la element = påminnelserListe [indexPath.row] cell.textLabel! .Text = item.name // (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray returcelle
På linje (4) får vi en telling av remindersList
liste over objekter, som vil angi antall for antall rader i vårt ett-seksjon Tableview
.
Deretter får vi for hver celle påminnelse
Live Objects eiendom for å sette etiketten, samt flagg om varen er merket som ferdig eller ikke.
Vi vil at brukerne skal kunne bytte et element som ferdig (og ikke ferdig), som vi angir ved å endre fargen på etiketten. Vi ønsker også å gjøre tabellvisningen redigerbar (brukere vil kunne fjerne celler ved å sveipe fra høyre til venstre), som vi oppnår ved å legge til følgende kode:
overstyr func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) la item = påminnelserListe [indexPath.row] prøv! self.realm.write (// (6) item.done =! item.done) // oppdatere rader tableView.reloadRows (ved: [indexPath], med: .automatic) overstyr func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true tilsidesatte func tableView (_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) if (edititingStyle == .delete) la item = remindersList [indexPath.row ] prøv! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (på: [indexPath], med: .automatic)
På linje (6), dette er første gang vi skriver tilbake til vår database, som du bare gjør innenfor en self.realm.write
blokkere. Vær oppmerksom på at alt du trenger å gjøre med en forekomst objekt er satt sin verdi, ingenting mer. Så i dette tilfellet bytter vi den ferdige verdien ved å gjøre item.done =! item.done
.
Linje (7) er vårt andre eksempel på å skrive tilbake til vår database: Vi sletter et objekt fra databasen ved bare å slette forekomstobjektet.
Vi gjør store fremskritt, og faktisk er vi nesten ferdige! Vi kan nå laste, redigere og slette våre påminnelser, men vi mangler en viktig handling: legger til en ny påminnelse. For å implementere dette, opprett en ny @IBAction
metode, og koble opp storyboardets Legg til verktøylinjeknapp til metoden.
Vi skal bygge en enkel AlertViewController
I vårt eksempel, men som en egen øvelse, prøv å forbedre appen ved å oppgradere dette til en ny visningskontroller i stedet.
For nå, fortsett og legg til følgende kode:
@IBAction func addReminder (_ sender: Any) la alertVC: UIAlertController = UIAlertController (tittel: "Ny påminnelse", melding: "Hva vil du huske?", PreferredStyle: .alert) alertVC.addTextField (UITextField) la cancelAction = UIAlertAction.init (tittel: "Cancel", stil: .destructive, handler: null) alertVC.addAction (cancelAction) // Alert action closure la addAction = UIAlertAction.init (tittel: "Legg til", stil:. standard) (UIAlertAction) -> Ugyldig i la textFieldReminder = (alertVC.textFields? .first)! som UITextField la reminderItem = Påminnelse () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // Vi legger til påminnelsen til vår database prøve! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (ved: [IndexPath.init (rad: self.remindersList.count-1, section: 0)], med : .automatic)) alertVC.addAction (addAction) til stede (alertVC, animert: true, fullføring: null)
På linje (8) lager vi en ny påminnelseseksempel og setter dens egenskaper. På linjen (9) legger vi til påminnelsen via self.realm.add (pos)
.
Så la oss prøve ut appen, ved å bygge og kjøre den i Simulator. Gå videre og legg til to påminnelser, og sett en av dem som gjort ved å trykke på den. Hvis du avslutter appen din og åpner den på nytt, bør elementene dine fortsatt være der.
Og det er det! Med liten eller ingen læringskurve, og ved å omgå noen av kompleksiteten til Core Data, har vi en fullt baket enhet på baksiden. Dette er Realm Mobile Database. Du kan også kontrollere at dataene er på enheten ved å laste ned Realm Browser, en macOS-app som lar oss se, feilsøke og redigere Realm-dataobjekter.
Last ned appen fra Mac App Store og åpne Realm-databasen, som ligger i din CoreSimulator / Enheter / AppID / data / ... mappe. Filen du leter etter er db.realm.
Når du åpner den, bør du ikke bare kunne se dataene dine, men også å redigere og legge til nye data. Gå videre og prøv det!
I denne opplæringen lærte du om Realm Mobile Database og hvorfor det er et kraftig verktøy for iOS-utvikleren. Vi har også kort berørt serverens motpart, Realm Mobile Platform, som vi vil dekke i en egen opplæring.
Vi bygget deretter en enkel påminnelsesapp som dreves av Realm Mobile Database. På bare noen få dusin linjer med kode kunne vi:
Endelig så du hvordan du bruker Realm Browser til å feilsøke og vise dataene dine.
Dette har vært en veldig grunnleggende introduksjon til Realm Mobile Database, men du kan bruke den som utgangspunkt for å starte på mer avanserte emner. Som neste trinn kan du se på:
Pass på å utforske noen av de avanserte temaene i dokumentasjonen ovenfor, for eksempel å jobbe med dataforhold, teste Realm-objekter, tråder og kryptering.
Og mens du er her, sørg for å sjekke ut noen av våre andre innlegg på IOS app utvikling!