In deze zelfstudie laat ik u zien hoe u een krachtige maar elegante database-oplossing op uw apparaat kunt gebruiken voor uw iOS-apps: Realm Mobile Database. Een alternatief voor Apple Core Data of SQLite met object-relationele mapping (ORM), Realm Mobile Database biedt ontwikkelaars een eenvoudigere en natuurlijkere manier om gegevens op te slaan en te vragen.
Gefactureerd als een ware objectendatabase onderscheidt Realm zich van andere vergelijkbare bibliotheken door data-objecten te behandelen als levende voorwerpen-betekenis objecten worden automatisch bijgewerkt. Ze reageren responsief op veranderingen en zijn gemakkelijk vol te houden. Sterker nog, je hebt niet de steile leercurve die je zou hebben met Core Data of SQLite-scripting. In plaats daarvan kunt u echt object-georiënteerd werken. Realm Mobile Database is vanaf 2016 ook open source en is gratis beschikbaar voor ontwikkelaars.
Naast Realm Mobile Database biedt het bedrijf ook Realm Mobile Platform, het vlaggenschip PAAS om Realm Mobile Database aan te vullen met een server-side oplossing.
Realm Mobile Platform breidt die kern uit met realtime gegevenssynchronisatie en gebeurtenisafhandeling aan de serverkant, allemaal naadloos verbonden met de apps. Ontwikkelaars gebruiken het platform om apps te bouwen met krachtige functionaliteit zoals functies voor berichtuitwisseling, samenwerking en offline-functionaliteit. Het platform is ook ideaal voor het mobiliseren van bestaande API's, waardoor het eenvoudig is om zeer responsieve en boeiende apps te maken die zijn verbonden met legacy-systemen en -services. (Realm.io)
Realm Mobile Platform werkt dus aan de serverzijde op dezelfde naadloze manier als Realm Mobile Database, met automatische gegevenssynchronisatie en gebeurtenisafhandeling tussen de client en de server, en in het proces dat de complexiteit wegneemt die ontstaat bij het omgaan met gegevenssynchronisatie. Realm Mobile Platform valt buiten het bestek van deze tutorial, maar ik kom er later op terug.
Naast het besparen van ontwikkelaars op de hoofdpijn en steile leercurve van Core Data, biedt Realm Mobile Database onderscheidende voordelen direct uit de verpakking.
Prestatiesgewijs is bewezen dat Realm Mobile Database query's uitvoert en objecten aanzienlijk sneller synchroniseert dan Core Data, en dat tegelijkertijd toegang tot de gegevens geen probleem is. Dat wil zeggen dat meerdere bronnen toegang kunnen hebben tot hetzelfde object zonder sloten te hoeven beheren of zich zorgen hoeven te maken over inconsistenties in gegevens.
Realm Mobile Database biedt zijn eigen coderingsdiensten om databases op schijf te beveiligen met behulp van AES-256 + SHA2 via 64-byte encryptie.
Dit maakt het zo dat alle gegevens die op de schijf zijn opgeslagen, zo nodig transparant worden gecodeerd en gedecodeerd met AES-256 en geverifieerd met een SHA-2 HMAC. Dezelfde coderingssleutel moet worden verstrekt elke keer dat u een realm-instantie verkrijgt.
In tegenstelling tot Core Data is Realm Mobile Database echt platformonafhankelijk en ondersteunt iOS-, Android-, JavaScript-webapps en Xamarin.
Vanwege de manier waarop de live objecten werken, kunt u uw gebruikersinterface-elementen verbinden met de gegevensmodellen en wordt uw gebruikersinterface reactief bijgewerkt naarmate de gegevens veranderen! Er is geen gecompliceerde synchronisatiecode of bedradingslogica nodig, zoals u zou doen met Core Data.
In combinatie met Realm Mobile Platform en de Realm Object Server krijgen ontwikkelaars het extra voordeel dat ze hun gegevens synchroniseren met de cloud door simpelweg de URL van het Realm-object in te stellen.
Zelfs als u Realm Mobile Platform gebruikt, hoeft u zich geen zorgen te maken over onderbroken verbindingen, omdat Realm ingebouwde offlinemogelijkheden heeft en alle gegevenswijzigingen in de wachtrij plaatst die naar de server worden verzonden.
Realm heeft een groot aantal onderscheiden klanten die Realm Mobile Database openlijk hebben overgenomen, waaronder Netflix en Starbucks.
Natuurlijk is Realm Mobile Database niet de enige app-opslagoplossing. Ik noemde al Apple's eigen Core Data, en hoewel het inherent ingewikkelder is om te leren, betekent het feit dat het bij Apple hoort dat het de de facto database-oplossing voor veel iOS-ontwikkelaars, en zal nog steeds een grote gemeenschap van ontwikkelaars en ondersteunend materiaal hebben.
Een oplossing die enigszins lijkt op Realm Mobile Database is Firebase van Google, hoewel dit een gecombineerde client-side en server-side oplossing is. Firebase is op dezelfde manier eenvoudig te gebruiken en het is gratis om mee te beginnen, maar de kosten zullen schalen naarmate uw gebruik dit doet. Een nadeel van Firebase is dat je nauw verbonden bent met hun platform, terwijl je met Realm je eigen back-end kunt gebruiken - of helemaal geen back-end!
Deze tutorial gaat ervan uit dat je een praktische kennis hebt van Swift, maar er is geen kerngegevens of eerdere databasekennis nodig.
Naast Realm zullen we de volgende delen van iOS gebruiken:
Tegen het einde van deze tutorial, heb je een eenvoudige to-do-app ontwikkeld die geschreven is in Swift en gebruik makend van Realm Mobile Database om gegevens lokaal aan te houden. U krijgt de mogelijkheid om een volledig werkende real-time-bezette to-do-app te maken en onderweg leert u de volgende concepten:
Je kunt de volledige broncode downloaden van de tutorial GitHub repo.
Oké, laten we aan de slag gaan met het maken van onze Realm-app: RealmDo. We gaan een nieuw Xcode-project maken, dus ga door en maak een Master-Detail-toepassing.
Als u CocoaPods vervolgens niet op uw computer hebt geïnstalleerd, moet u dit nu doen. Dus spring naar terminal en typ het volgende:
$ sudo gem install cocoapods
Je zou dan een bevestiging moeten krijgen dat cocoapoda inderdaad is geïnstalleerd. Ga terwijl u zich nog in de terminal bevindt naar het Xcode-project dat u zojuist hebt gemaakt en typ het volgende om een nieuw Podfile te initialiseren:
$ pod init
Je zou een nieuw bestand moeten zien met de naam Podfile bevindt zich in de hoofdmap van uw project. Dit bestand bevat in principe de bibliotheken die we in ons project willen gebruiken. U kunt de officiële CocoaPods-documentatie raadplegen voor meer informatie over hoe Podfiles werkt.
Vervolgens moeten we de cocoapod-bibliotheek voor Realm toevoegen, dus open de Podfile in een teksteditor en voeg het volgende onderaan toe # Pods voor RealmDo
:
... gebruik dynamische frameworks use_frameworks! # Pods voor RealmDo pod 'RealmSwift' target 'RealmDoTests' do ...
Sla het bestand op, sluit af en typ:pod installeren
Nadat CocoaPods klaar is met het installeren van de bibliotheek, vraagt het ons om ons Xcode-project te sluiten en de werkruimte te openen. Doe dat, en we zijn klaar om door te gaan met coderen. We zullen beginnen met de AppDelegate
.
In onze AppDelegate
we gaan de Realm-bibliotheek importeren, dus voeg het volgende toe aan de AppDelegate.swift het dossier:
import UIKit import RealmSwift @UIApplicationMain class AppDelegate: ...
Laat de klas zoals nu is, zodat we onze focus kunnen richten op het modelobject.
Het definiëren van modellen in Realm is doodeenvoudig; u maakt gewoon een logische modellens. In ons project gaan we herinneringen opslaan, dus laten we een klasse maken met de naam Reminder.swift, met de volgende code:
import RealmSwift class Herinnering: Object dynamic var name = "" dynamic var done = false
Voor deze zelfstudie hebben we dit alleen nodig Herinnering
model, dus we zijn klaar! Het is zo simpel, en een model maken is net zo gemakkelijk, zoals we later zullen ontdekken.
Nu richten we onze aandacht op de view controllers, maar voordat we naar de MasterViewController.swift klas, laten we open gaan Main.storyboard en voeg een balknop toe in de rechterbovenhoek, genaamd Toevoegen, zoals hieronder getoond:
Het project is geïnitialiseerd door Xcode met de gegevensbron en gedelegeerde verbonden met de view-controller, dus alles wat we moeten doen is de knop die we zojuist hebben gemaakt toevoegen aan de view-controller als een IBOutlet
. Houd ingedrukt en sleep van de knop naar de view-controller in de modus Split-view om de link te genereren.
Nu, doorgaan naar de MasterViewController.swift bestand, we verklaren de variabelen die we nodig zullen hebben, die er ongeveer als volgt uitzien:
class MasterViewController: UITableViewController var realm: Realm! // (1) @IBOutlet weak var addButton: UIBarButtonItem! var remindersList: resultaten// (2) haal return realm.objects (Reminder.self) override func viewDidLoad () // (3) super.viewDidLoad () // Voer een extra setup uit na het laden van de view, meestal vanaf een punt . rijk = probeer! Realm () ...
Eerst verklaren we op regel (1) de variabele Realm waarnaar we verwijzen om naar onze datastore te gaan. Vervolgens laden we de remindersList
de Realm-objecten aanroepen voor een lijst met alle herinneringsobjecten. Ten slotte geven we de Realm-variabele die we aan het begin hebben gedeclareerd. Tot nu toe niet ingewikkeld!
Vervolgens hebben we onze tableView
delegate en datasource-methoden, als volgt:
override func numberOfSections (in tableView: UITableView) -> Int return 1 override func tableView (_ tableView: UITableView, numberOfRowsInSection sectie: Int) -> Int // (4) return remindersList.count negeer func tableView (_ tableView : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell (withIdentifier: "Cell", for: indexPath) let item = remindersList [indexPath.row] cell.textLabel! .Text = item.name // (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray-retourcel
Op regel (4) krijgen we een telling van de remindersList
lijst van objecten, die de telling voor het aantal rijen in onze één sectie zal instellen tableView
.
Vervolgens krijgen we voor elke cel de Herinnering
het object van het live-object om het label in te stellen, en ook om aan te geven of het item als voltooid is gemarkeerd of niet.
We willen dat onze gebruikers een item kunnen omschakelen als klaar (en niet gedaan), wat we aangeven door de kleur van het label te wijzigen. We willen ook dat de tabel kan worden bewerkt (gebruikers kunnen cellen verwijderen door van rechts naar links te vegen), wat we bereiken door de volgende code toe te voegen:
override func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let item = remindersList [indexPath.row] probeer het! self.realm.write (// (6) item.done =! item.done) // refresh rows tableView.reloadRows (op: [indexPath], met: .automatic) override func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true override func tableView (_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) if (editingStyle == .delete) let item = remindersList [indexPath.row ] proberen! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (op: [indexPath], met: .automatic)
On line (6) is dit de eerste keer dat we terug naar onze database schrijven, wat u eenvoudig doet binnen een self.realm.write
blok. Merk op dat alles wat u hoeft te doen met een instantie-object zijn waarde heeft ingesteld, niets meer. Dus in dit geval schakelen we de voltooide waarde door te doen item.done =! item.done
.
Regel (7) is ons tweede voorbeeld van het terugschrijven naar onze database: we verwijderen een object uit de database door het exemplaarobject eenvoudig te verwijderen.
We boeken grote vooruitgang, en in feite zijn we bijna klaar! We kunnen onze herinneringen nu laden, bewerken en verwijderen, maar we missen één belangrijke actie: een nieuwe herinnering toevoegen. Om dit te implementeren, maakt u een nieuwe @IBAction
methode, en bedraad je storyboards Toevoegen werkbalkknop voor de methode.
We gaan een eenvoudig bouwen AlertViewController
probeer in ons voorbeeld, maar als een afzonderlijke oefening, de app te verfijnen door deze in plaats daarvan te upgraden naar een nieuwe view-controller.
Voor nu, ga je gang en voeg de volgende code toe:
@IBAction func addReminder (_ sender: Any) let alertVC: UIAlertController = UIAlertController (titel: "New Reminder", bericht: "Wat wilt u onthouden?", PreferredStyle: .alert) alertVC.addTextField (UITextField) in laat cancelAction = UIAlertAction.init (titel: "Annuleren", stijl: .destructive, handler: nil) alertVC.addAction (cancelAction) // Alarmactie afsluiten laat addAction = UIAlertAction.init (titel: "Toevoegen", stijl:. standaard) (UIAlertAction) -> Void in laat textFieldReminder = (alertVC.textFields? .first)! als UITextField reminderItem = Reminder () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // We voegen de herinnering aan onze database toe, probeer het! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (op: [IndexPath.init (row: self.remindersList.count-1, section: 0)], met : .automatic)) alertVC.addAction (addAction) present (alertVC, geanimeerd: true, completion: nil)
On line (8) maken we een nieuwe herinneringsinstantie en stellen we de eigenschappen in. Vervolgens voegen we op regel (9) de herinnering toe via self.realm.add (item)
.
Dus laten we de app uitproberen, door deze in Simulator te bouwen en uit te voeren. Ga je gang en voeg twee herinneringen toe en stel één ervan in als voltooid door erop te tikken. Als u uw app afsluit en deze weer opnieuw opent, moeten uw items er nog steeds zijn.
En dat is het! Met weinig tot geen leercurve, en door het omzeilen van een van de complexiteiten van Core Data, hebben we een volledig on-device back-end. Dit is Realm Mobile Database. U kunt ook controleren of de gegevens zich op het apparaat bevinden door Realm Browser te downloaden, een macOS-app waarmee we Realm-gegevensobjecten kunnen bekijken, debuggen en bewerken.
Download de app in de Mac App Store en open de Realm-database, die zich in uw. Bevindt CoreSimulator / apparaten / appID / data / ... map. Het bestand dat u zoekt is db.realm.
Als u deze opent, kunt u niet alleen uw gegevens bekijken, maar ook nieuwe gegevens bewerken en toevoegen. Ga je gang en probeer het!
In deze tutorial leer je over Realm Mobile Database en waarom het een krachtige tool is voor de iOS-ontwikkelaar. We hebben ook kort de tegenhanger van de server, Realm Mobile Platform, aangeraakt, die we in een afzonderlijke tutorial zullen behandelen.
We hebben vervolgens een eenvoudige remindersapp gebouwd die wordt aangedreven door Realm Mobile Database. In slechts enkele tientallen regels code konden we:
Ten slotte zag u hoe u Realm Browser gebruikt om uw gegevens te debuggen en te bekijken.
Dit is een zeer elementaire inleiding tot Realm Mobile Database, maar je kunt het gebruiken als een startpunt voor het aangaan van meer geavanceerde onderwerpen. Als volgende stappen zou je kunnen kijken naar:
Zorg ervoor dat u een aantal van de geavanceerde thema's uit de bovenstaande documentatie verkent, zoals werken met gegevensrelaties, het testen van Realm-objecten, draadsnijden en codering.
En als je er bent, kijk dan eens naar enkele van onze andere berichten over de ontwikkeling van iOS-apps!