I den här handledningen visar jag dig hur du använder en kraftfull, men elegant databaslösning på en enhet för dina iOS-appar: Realm Mobile Database. Ett alternativ till Apple Core Data eller SQLite med Object-Relational mapping (ORM), Realm Mobile Database erbjuder utvecklare ett enklare och mer naturligt sätt att lagra och söka data.
Faktureras som en sann objektdatabas, differentierar Realm sig från andra liknande bibliotek genom att behandla dataobjekt som levande föremål-vilket innebär att objekt uppdateras automatiskt. De reagerar responsivt på förändringar och är lätta att fortsätta. Ännu bättre, du har inte den branta inlärningskurvan som du skulle använda med Core Data eller SQLite-skript. I stället kan du arbeta på ett verkligt objektorienterat sätt. Realm Mobile Database har också blivit öppen från och med 2016 och finns gratis till utvecklare.
Förutom Realm Mobile Database erbjuder företaget även Realm Mobile Platform, dess flaggskepps-PAAS som komplement till Realm Mobile Database med en server-sida-lösning.
Realm Mobile Platform, utökar den kärnan med realtids datasynkronisering och händelsehantering på serverns sida, alla sömlöst anslutna till appar. Utvecklare använder plattformen för att bygga appar med kraftfull funktionalitet som meddelanden, samarbete och offline-första möjligheter. Plattformen är också idealisk för mobilisering av befintliga API, vilket gör det enkelt att bygga mycket lyhörda och engagerande appar kopplade till äldre system och tjänster. (Realm.io)
Så Realm Mobile Platform arbetar på serverns sida på samma sömlösa sätt som Realm Mobile Database, vilket ger automatisk datasynkronisering och händelsehantering mellan klienten och servern, och i processen abstraherar komplexiteten som uppstår vid hantering av datasynkronisering. Realm Mobile Platform ligger utanför omfattningen av denna handledning, men jag kommer tillbaka till den i ett framtida inlägg.
Utöver att spara utvecklare huvudvärk och brant inlärningskurva för Core Data, ger Realm Mobile Database tydliga fördelar direkt ur lådan.
Prestationsvis har Realm Mobile Database visat sig köra frågor och synkronisera objekt betydligt snabbare än Core Data, och det är inte ett problem att åtkomst till data samtidigt. Det betyder att flera källor kan komma åt samma objekt utan att behöva hantera lås eller oroa sig för inkonsekvenser av data.
Realm Mobile Database tillhandahåller egna krypteringstjänster för att skydda databaser på disk med AES-256 + SHA2 genom 64-byte-kryptering.
Detta gör det så att alla data som är lagrade på disken är krypterade och dekrypterade med AES-256 efter behov och verifieras med en SHA-2 HMAC. Samma krypteringsnyckel måste levereras varje gång du får en Realm-instans.
Till skillnad från kärndata är Realm Mobile Database verkligen plattformsplattform, som stöder iOS, Android, JavaScript-webprogram och Xamarin.
På grund av hur de levande objekten fungerar kan du koppla upp dina gränssnittselement till datormodellerna och ditt användargränssnitt uppdateras reaktivt när data ändras! Det behövs ingen komplicerad synkroniseringskod eller ledningslogik, som du skulle ha med Core Data.
När de kombineras med Realm Mobile Platform och Realm Object Server, kommer utvecklare att få extra fördelen av att synkronisera data till molnet genom att helt enkelt ställa in URL för Realm Object.
Även med Realm Mobile Platform behöver du inte oroa dig för avbrutna anslutningar, eftersom Realm har inbyggda offlinefunktioner och kommer att köa några dataändringar som ska skickas till servern.
Realm har många framstående kunder som öppet har antagit Realm Mobile Database, inklusive Netflix och Starbucks.
Naturligtvis är Realm Mobile Database inte den enda applagringslösningen. Jag nämnde redan Apples egna kärndata, och medan det i sig är mer komplicerat att lära sig, betyder det att det tillhör Apple betyder att det blir den de facto databaslösning för många iOS-utvecklare, och kommer fortsätta att ha en stor grupp av utvecklare och supportmaterial.
En lösning som liknar Realm Mobile Database är Googles Firebase, även om det här är en kombinerad lösning för klientsidor och server-sidor. Firebase är lika lätt att använda och det är gratis att komma igång med, men kostnaderna kommer att skala efter användningen. En nackdel med Firebase är att du är tätt kopplad till plattformen, medan med Realm du är fri att använda ditt eget back-end-eller inget back-end alls!
Denna handledning förutsätter att du har en fungerande kunskap om Swift, men ingen kärndata eller tidigare databaskunskaper behövs.
Förutom Realm använder vi följande delar av iOS:
I slutet av denna handledning har du utvecklat en enkel att göra-app som är skrivet i Swift och använder Realm Mobile Database för att fortsätta data lokalt. Du kommer att få skapa en fullt fungerande Realm-powered-gör-app, och längs vägen lär du dig följande begrepp:
Du kan ladda ner hela källkoden från handledning GitHub repo.
Okej, låt oss börja skapa vår Realm-app: RealmDo. Vi ska skapa ett nytt Xcode-projekt, så fortsätt och skapa en applikation för Master-Detail.
Om du inte har installerat CocoaPods på din maskin måste du göra det nu. Så hoppa till terminal och skriv följande:
$ sudo pärla installera cocoapods
Du får då en bekräftelse på att cocoapods verkligen är installerad. Medan du fortfarande befinner dig i terminalen, navigerar du till Xcode-projektet du just skapade och skriver följande, för att initiera en ny Podfile:
$ pod init
Du borde se en ny fil som heter Podfile ligger i rotkatalogen av ditt projekt. Den här filen anger i grunden de bibliotek vi vill använda i vårt projekt. Du kan referera till den officiella CocoaPods dokumentationen för mer information om hur Podfiles fungerar.
Därefter måste vi lägga till cocoapod-biblioteket för Realm, så öppna Podfile i en textredigerare och lägg till följande under # Pods för RealmDo
:
... använd dynamiska ramar use_frameworks! # Pods för RealmDo pod 'RealmSwift'-målet' RealmDoTests 'gör ...
Spara filen, avsluta och skriv:pod installera
Efter att CocoaPods slutar installera biblioteket, kommer det att be oss att stänga vårt Xcode-projekt och öppna upp arbetsytan. Gör det, och vi är redo att fortsätta med kodning. Vi börjar med AppDelegate
.
I vår AppDelegate
Vi ska importera Realm-biblioteket, så lägg till följande till AppDelegate.swift fil:
importera UIKit import RealmSwift @UIApplicationMain class AppDelegate: ...
Lämna klassen som det är för nu, så vi kan vända vårt fokus till modellobjektet.
Definiera modeller i Realm är död enkelt; du skapar bara en logisk modellklass. I vårt projekt ska vi lagra påminnelser, så låt oss skapa en klass som heter Reminder.swift, med följande kod:
importera RealmSwift-klassen Påminnelse: Objekt dynamiskt varnamn = "" dynamiskt var gjort = false
För denna handledning behöver vi bara det här Påminnelse
modell, så vi är alla färdiga! Det är så enkelt, och instantiating en modell är lika enkelt, som vi kommer att ta reda på senare.
Nu fokuserar vi vår uppmärksamhet på visningsstyrarna, men innan vi går till MasterViewController.swift klass, låt oss öppna Main.storyboard och lägg till en streckknapp längst upp till höger, kallad Lägg till, enligt nedanstående:
Projektet initierades av Xcode med datakällan och delegaten ansluten till visningsstyrenheten, så allt vi behöver göra är att lägga till den knapp som vi just skapat för visningskontrollen som en IBOutlet
. Håll och dra från knappen till visningsregulatorn i split-view-läget för att generera länken.
Nu går vidare till MasterViewController.swift fil, förklarar vi de variabler vi behöver, vilket ska se ut som följande:
klass MasterViewController: UITableViewController var realm: Realm! // (1) @IBOutlet weak var addButton: UIBarButtonItem! var påminnelserLista: Resultat// (2) få return realm.objects (Påminnelse.self) åsidosätta func viewDidLoad () // (3) super.viewDidLoad () // Gör någon ytterligare inställning efter att ha laddat upp visningen, vanligtvis från en spets . rike = prova! Realm () ...
Först, på rad (1), deklarerar vi Realm-variabeln som vi refererar till för att komma till vår datastore. Då laddar vi lata på remindersList
Ringa Realm-objekten för en lista över alla påminnelseobjekt. Slutligen instämmer vi Realm-variabeln som vi deklarerade i början. Ingenting för komplicerat hittills!
Därefter inrättade vi vår Tableview
delegera och datakälla metoder, enligt följande:
överträffa func numberOfSections (i tableView: UITableView) -> Int return 1 överskridelse func tableView (_ tableView: UITableView, numberOfRowsInSection avsnitt: Int) -> Int // (4) returnera påminnelserList.count åsidosätta func tableView : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell låt cellen = tableView.dequeueReusableCell (withIdentifier: "Cell", för: indexPath) låt item = remindersList [indexPath.row] cell.textLabel! .Text = item.name // (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray returcell
På linje (4) får vi en räkning av remindersList
lista över objekt, som ställer in räkningen för antalet rader i vårt ena avsnitt Tableview
.
Sedan, för varje cell, får vi Påminnelse
levande objektets egendom för att ställa in etiketten, samt att markera om objektet är markerat som färdigt eller inte.
Vi vill att våra användare ska kunna byta ett objekt som gjort (och inte gjort), vilket vi anger genom att ändra etikettens färg. Vi vill också göra tabellvisningen redigerbar (användarna kommer att kunna ta bort celler genom att svepa från höger till vänster), vilket vi uppnår genom att lägga till följande kod:
åsidosätta func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let item = remindersList [indexPath.row] försök! self.realm.write (// (6) item.done =! item.done) // uppdatera rader tableView.reloadRows (vid: [indexPath], med: .automatic) åsidosätta func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true överträffa func tableView (_ tableView: UITableView, commit redigeringStyle: UITableViewCellEditingStyle, förRowAt indexPath: IndexPath) if (edititingStyle == .delete) let item = remindersList [indexPath.row ] Prova! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (vid: [indexPath], med: .automatic)
På rad (6) är det första gången vi skriver tillbaka till vår databas, som du helt enkelt gör inom en self.realm.write
blockera. Observera att allt du behöver göra med ett instansobjekt är satt till sitt värde, inget mer. Så i det här fallet byter vi det gjorda värdet genom att göra item.done =! item.done
.
Linje (7) är vårt andra exempel på att skriva tillbaka till vår databas: vi tar bort ett objekt från databasen genom att helt enkelt radera förekomstobjektet.
Vi gör stora framsteg, och i själva verket är vi nästan färdiga! Vi kan nu ladda, redigera och ta bort våra påminnelser, men vi saknar en viktig åtgärd: lägger till en ny påminnelse. För att genomföra detta, skapa en ny @IBAction
metod och koppla upp din storyboard Lägg till verktygsfältet knappen till metoden.
Vi ska bygga en enkel AlertViewController
I vårt exempel, men som en separat övning, försök att förfina appen genom att uppgradera den till en ny bildkontroll i stället.
För nu, fortsätt och lägg till följande kod:
@IBAction func addReminder (_ avsändare: Alla) let alertVC: UIAlertController = UIAlertController (titel: "Ny påminnelse", meddelande: "Vad vill du komma ihåg?", PreferredStyle: .alert) alertVC.addTextField (UITextField) låt cancelAction = UIAlertAction.init (titel: "Avbryt", stil: .destructive, handler: nil) alertVC.addAction (cancelAction) // Alert action closure låt addAction = UIAlertAction.init (titel: "Lägg till", stil:. standard) (UIAlertAction) -> Invalid i let textFieldReminder = (alertVC.textFields? .first)! som UITextField låt reminderItem = Påminnelse () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // Vi lägger till påminnelsen i vår databas försök! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (vid: [IndexPath.init (rad: self.remindersList.count-1, section: 0)], med : .automatic)) alertVC.addAction (addAction) närvarande (alertVC, animerad: true, completion: nil)
På linje (8) skapar vi en ny påminnelse förekomst och sätter dess egenskaper. Sedan lägger vi på påminnelsen via linjen (9) self.realm.add (post)
.
Så låt oss prova appen genom att bygga och köra den i Simulator. Gå vidare och lägg till två påminnelser, och ställ in en av dem som gjort genom att knacka på den. Om du lämnar din app och öppnar den igen, måste dina objekt fortfarande finnas där.
Och det är allt! Med liten eller ingen inlärningskurva, och genom att kringgå någon av komplexiteten i Core Data, har vi en helt bakad baksida på baksidan. Detta är Realm Mobile Database. Du kan också verifiera att data finns på enheten genom att ladda ner Realm Browser, en macOS-app som låter oss visa, felsöka och redigera Realm-dataobjekt.
Ladda ner appen från Mac App Store och öppna Realm-databasen, som finns i din CoreSimulator / Enheter / appID / data / ... mapp. Filen du letar efter är db.realm.
När du öppnar den ska du inte bara kunna se dina data, men också att redigera och lägga till nya data. Gå vidare och prova det!
I den här handledningen lärde du dig om Realm Mobile Database och varför det är ett kraftfullt verktyg för IOS-utvecklaren. Vi har också kort berört sin server motsvarighet, Realm Mobile Platform, som vi kommer att täcka i en separat handledning.
Vi byggde sedan en enkel påminnelserapp som drivs av Realm Mobile Database. På bara några dussin rader av kod kunde vi:
Slutligen såg du hur du använder Realm Browser för att felsöka och visa dina data.
Detta har varit en väldigt grundläggande introduktion till Realm Mobile Database, men du kan använda den som utgångspunkt för att starta vidare avancerade ämnen. Som nästa steg kan du titta på:
Var noga med att utforska några av de avancerade teman i ovanstående dokumentation, till exempel att arbeta med datarelationer, testa Realm-objekt, threading och kryptering.
Och medan du är här, se till att kolla in några av våra andra inlägg i IOS App Development!