Realm Mobile Database für iOS

Was Sie erstellen werden

Einführung

In diesem Tutorial zeige ich Ihnen, wie Sie eine leistungsstarke und dennoch elegante On-Device-Datenbanklösung für Ihre iOS-Apps verwenden: Realm Mobile Database. Als Alternative zu Apple Core Data oder SQLite mit objektrelationalem Mapping (ORM) bietet Realm Mobile Database Entwicklern eine einfachere und natürlichere Methode zum Speichern und Abfragen von Daten.

Was ist Realm Mobile-Datenbank??

Realm wird als echte Objektdatenbank in Rechnung gestellt und unterscheidet sich von anderen ähnlichen Bibliotheken, indem es Datenobjekte als behandelt Live-Objekte-Bedeutungsobjekte werden automatisch aktualisiert. Sie reagieren auf Änderungen und sind leicht zu persistieren. Noch besser ist, dass Sie nicht über die steile Lernkurve verfügen, die Sie mit Core Data oder SQLite-Skripting erreichen würden. Stattdessen können Sie wirklich objektorientiert arbeiten. Realm Mobile Database ist seit 2016 ebenfalls Open-Sourcing und steht Entwicklern kostenlos zur Verfügung.

Neben der Realm Mobile Database bietet das Unternehmen die Realm Mobile Platform an, sein Flaggschiff PAAS, um die Realm Mobile Database um eine serverseitige Lösung zu ergänzen.

Realm Mobile Platform erweitert diesen Kern um Echtzeit-Datensynchronisierung und Ereignisbehandlung auf der Serverseite, die alle nahtlos mit den Apps verbunden sind. Entwickler nutzen die Plattform, um Apps mit leistungsstarken Funktionen wie Messaging, Collaboration und Offline-First-Funktionen zu erstellen. Die Plattform ist auch ideal für die Mobilisierung vorhandener APIs, wodurch das Erstellen von reaktionsschnellen und ansprechenden Apps, die mit älteren Systemen und Diensten verbunden sind, vereinfacht wird. (Realm.io)

Die Realm Mobile-Plattform arbeitet daher auf der Serverseite auf die gleiche nahtlose Weise wie die Realm Mobile-Datenbank. Sie bietet automatische Datensynchronisierung und Ereignisbehandlung zwischen Client und Server und abstrahiert dabei die Komplexität, die bei der Datensynchronisation auftritt. Die Realm Mobile-Plattform geht über den Rahmen dieses Tutorials hinaus, aber ich werde in einem zukünftigen Beitrag darauf zurückkommen.

Warum eine mobile Datenbank??

Realm Mobile Database bietet Entwickler nicht nur Kopfschmerzen und steile Lernkurven bei Core Data, sondern bietet auch markante Vorteile.

Leistung & Thread-Sicherheit

In Bezug auf die Leistung hat sich erwiesen, dass Realm Mobile Database Abfragen und Synchronisierungsobjekte erheblich schneller als Core Data ausführt und der gleichzeitige Zugriff auf die Daten kein Problem darstellt. Das heißt, mehrere Quellen können auf dasselbe Objekt zugreifen, ohne Sperren verwalten zu müssen oder sich um Dateninkonsistenzen kümmern zu müssen.

Verschlüsselung

Realm Mobile Database bietet eigene Verschlüsselungsdienste zum Schutz von Datenbanken auf der Festplatte AES-256 + SHA2 durch 64-Byte-Verschlüsselung.

Dadurch werden alle auf der Festplatte gespeicherten Daten bei Bedarf transparent mit AES-256 verschlüsselt und entschlüsselt und mit einer SHA-2-HMAC überprüft. Der gleiche Verschlüsselungsschlüssel muss bei jedem Abruf einer Realm-Instanz bereitgestellt werden.

Plattformübergreifend

Im Gegensatz zu Core Data ist Realm Mobile Database wirklich plattformübergreifend und unterstützt iOS, Android, JavaScript-Web-Apps und Xamarin.

Reaktive Natur

Aufgrund der Funktionsweise der Live-Objekte können Sie Ihre UI-Elemente mit den Datenmodellen verbinden, und Ihre UI wird bei Änderungen der Daten reaktiv aktualisiert! Es ist kein komplizierter Synchronisationscode oder keine Verdrahtungslogik erforderlich, wie dies bei Core Data der Fall wäre.

Durch die Kombination mit der Realm Mobile-Plattform und dem Realm Object Server erhalten Entwickler den zusätzlichen Vorteil der Synchronisierung ihrer Daten in die Cloud, indem sie einfach die Realm Object-URL festlegen.

Selbst mit der Realm Mobile Platform müssen Sie sich keine Sorgen um unterbrochene Verbindungen machen, da Realm über integrierte Offline-Funktionen verfügt und alle Datenänderungen in die Warteschlange gestellt werden, die an den Server gesendet werden sollen.

Kunden

Realm verfügt über zahlreiche namhafte Kunden, die die Realm Mobile Database offen übernommen haben, darunter Netflix und Starbucks.

Alternativen zur Realm Mobile-Datenbank

Natürlich ist Realm Mobile Database nicht die einzige App-Speicherlösung. Ich habe bereits Apples eigene Kerndaten erwähnt, und obwohl es von Natur aus komplizierter zu lernen ist, bedeutet es, dass es zu Apple gehört de facto Datenbank-Lösung für viele iOS-Entwickler und wird auch weiterhin eine große Gemeinschaft von Entwicklern und Support-Material haben.

Eine Lösung, die der Realm Mobile-Datenbank etwas ähnelt, ist Firebase von Google. Dies ist jedoch eine kombinierte Lösung auf Client- und Serverseite. Firebase ist ähnlich einfach zu verwenden und es ist kostenlos, mit den ersten Schritten zu beginnen, aber die Kosten steigen mit der Nutzung. Ein Nachteil von Firebase ist, dass Sie eng mit der Plattform verbunden sind. Mit Realm können Sie Ihr eigenes Back-End oder gar kein Back-End verwenden!

Deine erste Realm App

Angenommenes Wissen

In diesem Lernprogramm wird vorausgesetzt, dass Sie über Swift-Kenntnisse verfügen, jedoch keine Kerndaten oder Vorkenntnisse in der Datenbank erforderlich sind. 

Neben Realm werden wir die folgenden Teile von iOS verwenden:

  • UIKit: um unsere Daten visuell zu demonstrieren
  • CocoaPods: Eine Abhängigkeitsbibliothek eines Drittanbieters, die zur Installation von Realm Mobile Database verwendet wird

Ziele dieses Tutorials

Am Ende dieses Tutorials haben Sie eine einfache, in Swift geschriebene To-Do-Anwendung entwickelt, die die mobile Datenbank von Realm verwendet, um Daten lokal zu speichern. Sie können eine voll funktionsfähige, von Realm betriebene To-Do-App erstellen. Auf diesem Weg lernen Sie die folgenden Konzepte kennen:

  1. Einrichten der Realm-Bibliothek für ein neues Projekt über CocoaPods
  2. Einrichten des App-Delegierten zum Importieren der Bereichsbibliothek
  3. Erstellen der 'Live-Objekt'-Modellobjekte
  4. Erstellen der View Controller und des Storyboards in der App-Benutzeroberfläche
  5. Verbinden des Datenmodells mit den Ansichtssteuerungen und Ansichten

Sie können den vollständigen Quellcode aus dem GitHub-Repo des Tutorials herunterladen.

Richten Sie das Projekt ein

Okay, lass uns anfangen, unsere Realm App zu erstellen: RealmDo. Wir erstellen ein neues Xcode-Projekt. Erstellen Sie also eine Master-Detail-Anwendung.

Wenn Sie CocoaPods nicht auf Ihrem Computer installiert haben, müssen Sie dies jetzt tun. Also ins Terminal springen und folgendes eingeben:

$ sudo gem installiert cocoapods

Sie sollten dann eine Bestätigung erhalten, dass Cocoapods tatsächlich installiert sind. Wenn Sie sich noch im Terminal befinden, navigieren Sie zu dem Xcode-Projekt, das Sie gerade erstellt haben, und geben Sie Folgendes ein, um eine neue Pod-Datei zu initialisieren:

$ pod init

Sie sollten eine neue Datei mit dem Namen sehen Poddatei befindet sich im Stammverzeichnis des Projekts. Diese Datei enthält im Wesentlichen die Bibliotheken, die wir in unserem Projekt verwenden möchten. Weitere Informationen zur Funktionsweise von Podfiles finden Sie in der offiziellen CocoaPods-Dokumentation.

Als Nächstes müssen wir die Cocoapod-Bibliothek für Realm hinzufügen. Öffnen Sie also die Pod-Datei in einem Texteditor und fügen Sie darunter folgendes hinzu # Pods für RealmDo:

… Verwenden Sie dynamische Frameworks use_frameworks! # Pods für RealmDo pod "RealmSwift" zielen auf "RealmDoTests"… 

Speichern Sie die Datei, beenden Sie und geben Sie Folgendes ein:
pod installieren

Nachdem CocoaPods die Installation der Bibliothek abgeschlossen hat, werden wir aufgefordert, unser Xcode-Projekt zu schließen und den Arbeitsbereich zu öffnen. Tun Sie das und wir sind bereit, mit der Codierung fortzufahren. Wir beginnen mit dem AppDelegate.

Richten Sie den App-Delegierten ein, um die Bereichsbibliothek zu importieren

In unserer AppDelegate Wir werden die Realm-Bibliothek importieren, fügen Sie also Folgendes hinzu AppDelegate.swift Datei:

import UIKit import RealmSwift @UIApplicationMain-Klasse AppDelegate:… 

Belassen Sie die Klasse für den Moment, so dass wir uns auf das Modellobjekt konzentrieren können.

Live-Objektmodelle

Das Definieren von Modellen in Realm ist kinderleicht. Sie erstellen einfach eine logische Modellklasse. In unserem Projekt werden Erinnerungen gespeichert, also erstellen wir eine Klasse namens Erinnerungswechsel, mit dem folgenden Code:

import RealmSwift-Klasse Erinnerung: Object dynamischer var name = "" dynamischer var done = false 

Für dieses Tutorial benötigen wir nur dieses Erinnerung Modell, also sind wir fertig! So einfach ist das Instantiieren eines Modells genauso einfach, wie wir später erfahren werden. 

Richten Sie die View Controller und das Storyboard ein

Jetzt konzentrieren wir uns auf die View Controller, aber bevor wir zum gehen MasterViewController.swift Klasse, lass uns aufmachen Hauptplatine und füge oben rechts eine Balkenschaltfläche hinzu Hinzufügen, Wie nachfolgend dargestellt:

Das Projekt wurde von Xcode mit der Datenquelle und dem mit dem View-Controller verbundenen Delegierten initialisiert. Wir müssen also nur die Schaltfläche, die wir gerade erstellt haben, dem View-Controller als hinzufügen IBOutlet. Halten Sie und ziehen Sie im Split-View-Modus von der Schaltfläche zum View-Controller, um die Verknüpfung zu erstellen.

Bereich initialisieren

Nun geht es weiter zum MasterViewController.swift Datei deklarieren wir die Variablen, die wir brauchen werden, die ungefähr wie folgt aussehen sollten:

Klasse MasterViewController: UITableViewController var Realm: Realm! // (1) @IBOutlet schwaches var addButton: UIBarButtonItem! var ReminderList: Ergebnisse // (2) get return realm.objects (Reminder.self) Überschreiben Sie func viewDidLoad () // (3) super.viewDidLoad () // Führen Sie nach dem Laden der Ansicht weitere Einstellungen durch, normalerweise aus einer Feder . Reich = Versuch! Realm ()… 

Zuerst deklarieren wir in Zeile (1) die Realm-Variable, auf die wir verweisen, um zu unserem Datastore zu gelangen. Dann faulenzen wir die ReminderList Aufrufen der Bereichsobjekte für eine Liste aller Erinnerungsobjekte. Zum Schluss instanziieren wir die Realm-Variable, die wir zu Beginn deklariert haben. Nichts zu kompliziert bisher!

Richten Sie den View-Delegaten und die Datenquelle ein

Als nächstes richten wir unsere ein Tabellenansicht Delegieren und Datenquellenmethoden wie folgt:

func numberOfSections überschreiben (in tableView: UITableView) -> Int return 1 func tableView überschreiben (_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int // (4) return remindersList.count override func tableView (_ tableView) : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell (withIdentifier: "Cell" für: indexPath) (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray-Rückgabezelle 

In Zeile (4) erhalten wir eine Zählung der ReminderList Liste von Objekten, die die Anzahl der Zeilen in unserem Ein-Abschnitt festlegt Tabellenansicht.

Dann erhalten wir für jede Zelle das Erinnerung Eigenschaft eines Live-Objekts, um die Beschriftung festzulegen und zu kennzeichnen, ob das Element als erledigt markiert ist oder nicht.

Änderungen in die Datenbank schreiben

Wir möchten, dass unsere Benutzer in der Lage sind, einen Artikel als erledigt (und nicht erledigt) umzuschalten, was wir durch Ändern der Etikettenfarbe anzeigen. Wir möchten auch die Tabellenansicht editierbar machen (Benutzer können Zellen durch Wischen von rechts nach links entfernen). Dies erreichen wir durch Hinzufügen des folgenden Codes:

func tableView überschreiben (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let item = remindersList [indexPath.row] try! self.realm.write (// (6) item.done =! item.done) // Zeilen aktualisieren tableView.reloadRows (at: [indexPath], with: .automatic) überschreiben func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true überschreibt func tableView (_ tableView: UITableView, schreibt BearbeitungsStyle: UITableViewCellEditingStyle, forRowAt: indexPath) if (editorStyle == .delete) ] Versuchen! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (at: [indexPath], mit: .automatic) 

In Zeile (6) schreiben wir zum ersten Mal in unsere Datenbank zurück, was Sie einfach in einem tun selbst.realm.write Block. Beachten Sie, dass Sie mit einem Instanzobjekt nur seinen Wert festlegen müssen, nicht mehr. In diesem Fall schalten wir den Fertigwert also um item.done =! item.done

Zeile (7) ist unser zweites Beispiel für das Zurückschreiben in unsere Datenbank: Wir löschen ein Objekt aus der Datenbank, indem wir einfach das Instanzobjekt löschen.

Neue Objekte hinzufügen

Wir machen große Fortschritte und sind fast fertig! Wir können jetzt unsere Erinnerungen laden, bearbeiten und löschen, es fehlt jedoch eine wichtige Aktion: Hinzufügen einer neuen Erinnerung. Um dies zu implementieren, erstellen Sie ein neues @IBAction Methode und verdrahten Sie Ihr Storyboard Hinzufügen Symbolleisten-Schaltfläche zur Methode. 

Wir werden ein einfaches bauen AlertViewController Versuchen Sie in unserem Beispiel, aber als separate Übung, die App zu verfeinern, indem Sie diese stattdessen auf einen neuen View-Controller aktualisieren. 

Füllen Sie zunächst den folgenden Code aus:

@IBAction func addReminder (_ sender: Any) let alertVC: UIAlertController = UIAlertController (Titel: "New Reminder", Nachricht: "Was möchten Sie sich merken?", PreferredStyle: .alert) alertVC.addTextField (UITextField)  let cancelAction = UIAlertAction.init (Titel: "Cancel", Stil: .destructive, Handler: Null) alertVC.addAction (cancelAction) // Schließen der Alert-Aktion let addAction = UIAlertAction.init (Titel: "Add", Stil:. default) (UIAlertAction) -> Void in let textFieldReminder = (alertVC.textFields? .first)! als UITextField let reminderItem = Reminder () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // Wir fügen die Erinnerung zu unserer Datenbank hinzu try! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (um: [IndexPath.init (Zeile: self.remindersList.count-1, Abschnitt: 0)], mit : .automatic)) alertVC.addAction (addAction) vorhanden (alertVC, animiert: true, Completion: nil) 

In Zeile (8) erstellen wir eine neue Erinnerungsinstanz und legen deren Eigenschaften fest. Dann fügen wir in Zeile (9) die Erinnerung über ein self.realm.add (item).

App testen

Probieren Sie also die App aus, indem Sie sie in Simulator erstellen und ausführen. Fügen Sie zwei Erinnerungen hinzu, und legen Sie eine davon als erledigt fest, indem Sie darauf tippen. Wenn Sie Ihre App beenden und wieder öffnen, sollten Ihre Artikel noch vorhanden sein.

Reich-Stirnser

Und das ist es! Mit wenig oder gar keiner Lernkurve und durch die Umgehung der Komplexität von Core Data haben wir ein vollständig gebackenes Back-End auf dem Gerät. Das ist Realm Mobile-Datenbank. Sie können auch überprüfen, ob sich die Daten auf dem Gerät befinden, indem Sie Realm Browser herunterladen, eine macOS-App, mit der Sie Realm-Datenobjekte anzeigen, debuggen und bearbeiten können. 

Laden Sie die App aus dem Mac App Store herunter und öffnen Sie die Realm-Datenbank in Ihrer CoreSimulator / Geräte / AppID / Daten /… Mappe. Die Datei, nach der Sie suchen, ist db.realm.

Wenn Sie es öffnen, sollten Sie nicht nur Ihre Daten anzeigen, sondern auch bearbeiten und neue Daten hinzufügen können. Probieren Sie es aus!

Fazit

In diesem Lernprogramm haben Sie die Realm Mobile-Datenbank kennen gelernt und erfahren, warum sie ein leistungsfähiges Werkzeug für iOS-Entwickler ist. Wir haben auch kurz auf das Server-Pendant Realm Mobile Platform eingegangen, das wir in einem separaten Tutorial behandeln werden.

Wir haben dann eine einfache Erinnerungs-App entwickelt, die auf Realm Mobile Database basiert. In nur wenigen Dutzend Codezeilen konnten wir:

  1. Richten Sie ein Live-Objektmodell für die Erinnerung ein
  2. Verbinden Sie unseren View Controller mit dem Datenmodell
  3. deklarieren, instanziieren, laden, hinzufügen und aus der Realm-Datenbank löschen

Schließlich haben Sie gesehen, wie Sie mit dem Realm Browser Ihre Daten debuggen und anzeigen können.

Dies ist eine sehr einfache Einführung in die Realm Mobile-Datenbank. Sie können sie jedoch als Ausgangspunkt für fortgeschrittenere Themen verwenden. Als nächsten Schritt könnten Sie Folgendes betrachten:

  • Das Realm-Datenmodell
  • Dokumentation für Realm für Swift
  • Dokumentation für Realm für Objective-C 
  • Realm Mobile-Datenbank-API-Referenz

Stellen Sie sicher, dass Sie einige der fortgeschrittenen Themen in der obigen Dokumentation kennenlernen, z. B. Arbeiten mit Datenbeziehungen, Testen von Realm-Objekten, Threading und Verschlüsselung. 

Und während Sie hier sind, lesen Sie einige unserer anderen Beiträge zur Entwicklung von iOS-Apps!