Realm Database mobile per iOS

Cosa starai creando

introduzione

In questo tutorial, ti mostrerò come utilizzare una soluzione di database on-device potente ed elegante per le tue app iOS: Realm Mobile Database. In alternativa a Apple Core Data o SQLite con ORM (Object-Relational Mapping), Realm Mobile Database offre agli sviluppatori un modo più semplice e naturale per archiviare e interrogare i dati.

Che cos'è il Realm Mobile Database?

Presentato come un vero database di oggetti, Realm si differenzia da altre librerie simili trattando oggetti di dati come oggetti vivi-gli oggetti di significato vengono aggiornati automaticamente. Reagiscono in modo reattivo ai cambiamenti e sono facili da persistere. Ancora meglio, non hai la curva di apprendimento ripida che vorresti con Core Data o SQLite scripting. Invece, puoi lavorare in un modo veramente orientato agli oggetti. Realm Mobile Database è stato aperto anche a partire dal 2016 ed è disponibile gratuitamente per gli sviluppatori.

Oltre a Realm Mobile Database, l'azienda offre anche Realm Mobile Platform, il suo principale PAAS per integrare il Realm Mobile Database con una soluzione server-side.

Realm Mobile Platform estende tale core con la sincronizzazione dei dati in tempo reale e la gestione degli eventi sul lato server, il tutto perfettamente connesso alle app. Gli sviluppatori utilizzano la piattaforma per creare app con potenti funzionalità come messaggistica, collaborazione e funzionalità non in linea. La piattaforma è ideale anche per la mobilitazione di API esistenti, rendendo semplice la creazione di app altamente reattive e coinvolgenti collegate a sistemi e servizi legacy. (Realm.io)

Quindi Realm Mobile Platform funziona sul lato server nello stesso modo in cui Realm Mobile Database, fornendo la sincronizzazione automatica dei dati e la gestione degli eventi tra client e server, e nel processo astraendo le complessità che sorgono quando si ha a che fare con la sincronizzazione dei dati. Realm Mobile Platform va oltre lo scopo di questo tutorial, ma tornerò su di esso in un post futuro.

Perché Realm Database mobile?

Oltre a risparmiare agli sviluppatori il mal di testa e la curva di apprendimento ripida dei Core Data, Realm Mobile Database offre vantaggi distintivi fin dal primo momento.

Prestazioni e sicurezza del filo

Per quanto riguarda le prestazioni, Realm Mobile Database ha dimostrato di eseguire query e sincronizzare gli oggetti in modo significativamente più rapido rispetto ai Core Data e l'accesso simultaneo ai dati non rappresenta un problema. In altre parole, più origini possono accedere allo stesso oggetto senza la necessità di gestire i blocchi o preoccuparsi delle incoerenze dei dati.

crittografia

Realm Mobile Database fornisce i propri servizi di crittografia per proteggere i database su disco utilizzando AES-256 + SHA2 attraverso la crittografia a 64 byte.

In questo modo tutti i dati memorizzati sul disco vengono crittografati e decifrati in modo trasparente con AES-256 secondo necessità e verificati con un HMAC SHA-2. La stessa chiave di crittografia deve essere fornita ogni volta che si ottiene un'istanza di Realm.

Cross-Platform

A differenza di Core Data, Realm Mobile Database è veramente multipiattaforma, supporta app Web iOS, Android, JavaScript e Xamarin.

Natura reattiva

A causa del modo in cui funzionano gli oggetti live, puoi collegare gli elementi dell'interfaccia utente ai modelli di dati e l'interfaccia utente si aggiornerà in modo reattivo quando i dati cambiano! Non sono necessari complicati codici di sincronizzazione o logica di cablaggio, come avresti con Core Data.

Se abbinato a Realm Mobile Platform e Realm Object Server, gli sviluppatori avranno l'ulteriore vantaggio di sincronizzare i loro dati nel cloud semplicemente impostando l'URL dell'oggetto Realm.

Anche utilizzando Realm Mobile Platform, non devi preoccuparti di connessioni interrotte, poiché Realm ha funzionalità offline incorporate e accoderà le eventuali modifiche ai dati da inviare al server.

clienti

Realm ha numerosi clienti illustri che hanno adottato il Realm Mobile Database, tra cui Netflix e Starbucks.

Alternative al Realm Database mobile

Ovviamente, Realm Mobile Database non è l'unica soluzione di archiviazione dell'app. Ho già citato i Core Data di Apple, e mentre è intrinsecamente più complicato da imparare, il fatto che appartenga ad Apple significa che sarà il di fatto soluzione di database per molti sviluppatori iOS e continuerà ad avere una grande comunità di sviluppatori e materiale di supporto.

Una soluzione che è in qualche modo simile a Realm Mobile Database è la Firebase di Google, sebbene questa sia una soluzione combinata lato client e lato server. Firebase è allo stesso modo facile da usare ed è gratuito per iniziare, ma i costi si ridimensionano come il tuo utilizzo. Uno svantaggio di Firebase è che sei strettamente connesso alla loro piattaforma, mentre con Realm sei libero di usare il tuo back-end, o senza back-end!

La tua prima app del regno

Conoscenza presunta

Questo tutorial presume che tu abbia una conoscenza pratica di Swift, ma non sono necessari dati di base o conoscenze di database precedenti. 

Oltre a Realm, utilizzeremo le seguenti parti di iOS:

  • UIKit: per mostrare i nostri dati visivamente
  • CocoaPods: una libreria di dipendenze di terze parti che verrà utilizzata per installare Realm Mobile Database

Obiettivi di questo tutorial

Alla fine di questo tutorial, avrai sviluppato una semplice app da fare scritta in Swift e facendo uso di Realm Mobile Database per mantenere i dati localmente. Avrai la possibilità di creare un'app completamente operativa basata su Realm e, lungo il tuo percorso, imparerai i seguenti concetti:

  1. configurare la libreria Realm su un nuovo progetto, tramite CocoaPods
  2. configurazione del delegato dell'app per importare la libreria Realm
  3. creazione degli oggetti del modello 'live-object'
  4. creando i controller di visualizzazione e lo storyboard nell'interfaccia utente dell'app
  5. collegamento del modello dati ai controller e alle viste della vista

Puoi scaricare il codice sorgente completo dal tutorial repo GitHub.

Imposta il progetto

Ok, iniziamo a creare la nostra app di Realm: RealmDo. Creeremo un nuovo progetto Xcode, quindi procedi e crea un'applicazione Master-Detail.

Quindi, se non hai installato CocoaPods sul tuo computer, dovrai farlo ora. Quindi entra nel terminale e digita quanto segue:

$ sudo gem installa cocoapods

Dovresti quindi avere una conferma che i cocoapodi sono effettivamente installati. Mentre sei ancora nel terminale, accedi al progetto Xcode appena creato e digita quanto segue, per inizializzare un nuovo Podfile:

$ pod init

Dovresti vedere un nuovo file chiamato Podfile situato nella directory principale del tuo progetto. Questo file indica in pratica le librerie che vogliamo utilizzare nel nostro progetto. Puoi fare riferimento alla documentazione ufficiale di CocoaPods per ulteriori informazioni su come funzionano i podfile.

Successivamente, abbiamo bisogno di aggiungere la libreria cocoapod per Realm, quindi apri il Podfile in un editor di testo e aggiungi quanto segue sotto # Pods per RealmDo:

... usa i framework dinamici use_frameworks! # Pod per RealmDoTests 'RealmDoTests' per RealmDoTest pod 'RealmSwift' ... 

Salva il file, esci e digita:
installazione pod

Dopo che CocoaPods ha completato l'installazione della libreria, ci chiederà di chiudere il nostro progetto Xcode e di aprire lo spazio di lavoro. Fallo e siamo pronti a procedere con la codifica. Inizieremo con il AppDelegate.

Impostare il delegato dell'app per importare la libreria Realm

Nel nostro AppDelegate stiamo per importare la libreria Realm, quindi aggiungi quanto segue al AppDelegate.swift file:

import UIKit import RealmSwift @UIApplicationMain class AppDelegate: ... 

Lascia la classe come è ora, quindi possiamo concentrare l'attenzione sull'oggetto del modello.

Modelli di oggetti dal vivo

Definire modelli in Realm è semplicemente semplice; devi solo creare una classe di modello logica. Nel nostro progetto, stiamo per memorizzare i promemoria, quindi creiamo una classe chiamata Reminder.swift, con il seguente codice:

importare la classe RealmSwift Promemoria: Object dynamic var name = "" dynamic var done = false 

Per questo tutorial, abbiamo solo bisogno di questo Promemoria modello, quindi abbiamo finito! È così semplice e l'istanziazione di un modello è altrettanto semplice, come scopriremo più avanti. 

Imposta i controller di visualizzazione e lo storyboard

Ora focalizziamo la nostra attenzione sulla vista dei controller, ma prima di andare al MasterViewController.swift classe, apriamoci Main.storyboard e aggiungi un pulsante nella barra in alto a destra, chiamato Inserisci, come mostrato di seguito:

Il progetto è stato inizializzato da Xcode con l'origine dati e delegato cablato al controller di visualizzazione, quindi tutto ciò che dobbiamo fare è aggiungere il pulsante appena creato al controller di visualizzazione come IBOutlet. Tieni premuto e trascina dal pulsante sul controller della vista in modalità visualizzazione divisa per generare il collegamento.

Reame di inizializzazione

Ora, passando al MasterViewController.swift file, dichiariamo le variabili di cui avremo bisogno, il cui aspetto dovrebbe essere simile al seguente:

class MasterViewController: UITableViewController var realm: Realm! // (1) @IBOutlet weak var addButton: UIBarButtonItem! var remindersList: Results // (2) get return realm.objects (Reminder.self) override func viewDidLoad () // (3) super.viewDidLoad () // Esegue un'impostazione aggiuntiva dopo aver caricato la vista, in genere da un pennino . realm = prova! Reame () ... 

Innanzitutto, on line (1), dichiariamo la variabile Realm a cui andremo a riferirci per arrivare al nostro datastore. Quindi carichiamo il pigro remindersList chiamare gli oggetti Realm per un elenco di tutti gli oggetti Promemoria. Infine, istanziamo la variabile del Reame che abbiamo dichiarato all'inizio. Niente di troppo complicato finora!

Impostare il delegato della vista e l'origine dati

Successivamente, impostiamo il nostro tableView metodi delegati e origine dati, come segue:

override func numberOfSections (in tableView: UITableView) -> Int return 1 override func tableView (_ tableView: UITableView, numberOfRowsInSection sezione: Int) -> Int // (4) return remindersList.count override func tableView (_ tableView : UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell let cell = tableView.dequeueReusableCell (withIdentifier: "Cell", per: indexPath) let item = remindersList [indexPath.row] cell.textLabel! .Text = item.name // (5) cell.textLabel! .TextColor = item.done == false? UIColor.black: UIColor.lightGray restituisce la cella 

Sulla linea (4), otteniamo un conteggio del remindersList lista di oggetti, che imposterà il conteggio per il numero di righe nella nostra sezione tableView.

Quindi, per ogni cella, otteniamo il Promemoria vivi la proprietà dell'oggetto per impostare l'etichetta, oltre a segnalare se l'elemento è contrassegnato come fatto o meno.

Scrittura delle modifiche al database

Vogliamo che i nostri utenti siano in grado di attivare o disattivare un oggetto come fatto (e non fatto), che indichiamo cambiando il colore dell'etichetta. Vogliamo anche rendere modificabile la vista tabella (gli utenti saranno in grado di rimuovere le celle scorrendo da destra a sinistra), cosa che si ottiene aggiungendo il seguente codice:

override func tableView (_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) let item = remindersList [indexPath.row] prova! self.realm.write (// (6) item.done =! item.done) // aggiorna le righe tableView.reloadRows (a: [indexPath], con: .automatic) override func tableView (_ tableView: UITableView , canEditRowAt indexPath: IndexPath) -> Bool return true override func tableView (_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) if (editStyle == .delete) let item = remindersList [indexPath.row ] provare! self.realm.write (self.realm.delete (item) // (7)) tableView.deleteRows (at: [indexPath], con: .automatic) 

In linea (6), questa è la prima volta che scriviamo di nuovo nel nostro database, cosa che si fa semplicemente all'interno di a self.realm.write bloccare. Nota che tutto ciò che devi fare con un oggetto istanza è impostare il suo valore, niente di più. In questo caso, quindi, attiviamo il valore done item.done =! item.done

Line (7) è il nostro secondo esempio di scrittura sul nostro database: eliminiamo un oggetto dal database semplicemente cancellando l'oggetto istanza.

Aggiungere nuovi oggetti

Stiamo facendo grandi progressi e in effetti abbiamo quasi finito! Ora siamo in grado di caricare, modificare ed eliminare i nostri promemoria, ma mancano una azione importante: aggiungendo un nuovo promemoria. Per implementarlo, creane uno nuovo @IBAction metodo e cablare lo storyboard Inserisci pulsante della barra degli strumenti per il metodo. 

Stiamo andando a costruire un semplice AlertViewController nel nostro esempio, ma come esercizio separato, prova a perfezionare l'app aggiornandola a un nuovo controller di visualizzazione. 

Per ora, vai avanti e aggiungi il seguente codice:

@IBAction func addReminder (_ mittente: Qualsiasi) let alertVC: UIAlertController = UIAlertController (titolo: "Nuovo promemoria", messaggio: "Che cosa vuoi ricordare?", PreferredStyle: .alert) alertVC.addTextField (UITextField) in  let cancelAction = UIAlertAction.init (titolo: "Annulla", style: .destructive, handler: nil) alertVC.addAction (cancelAction) // Alert action closure let addAction = UIAlertAction.init (titolo: "Aggiungi", style:. default) (UIAlertAction) -> Void in let textFieldReminder = (alertVC.textFields? .first)! come UITextField lascia reminderItem = Reminder () // (8) reminderItem.name = textFieldReminder.text! reminderItem.done = false // Stiamo aggiungendo il promemoria al nostro database try! self.realm.write (self.realm.add (reminderItem) // (9) self.tableView.insertRows (a: [IndexPath.init (row: self.remindersList.count-1, section: 0)], con : .automatic)) alertVC.addAction (addAction) presente (alertVC, animated: true, completion: nil) 

Sulla linea (8), creiamo una nuova istanza di promemoria e ne impostiamo le proprietà. Quindi, in linea (9) aggiungiamo il promemoria via self.realm.add (voce).

Testare l'app

Quindi proviamo l'app, costruendola e eseguendola in Simulator. Vai avanti e aggiungi due promemoria e imposta uno di questi come fatto toccandolo. Se esci dall'app e la apri di nuovo, i tuoi articoli dovrebbero essere ancora lì.

Realm Browser

E questo è tutto! Con poca o nessuna curva di apprendimento e aggirando qualsiasi complessità dei dati di base, abbiamo un back-end on-device completamente cotto. Questo è Realm Database mobile. È inoltre possibile verificare che i dati siano presenti sul dispositivo scaricando Realm Browser, un'app macOS che ci consente di visualizzare, eseguire il debug e modificare gli oggetti dati Realm. 

Scarica l'app dal Mac App Store e apri il database di Realm, che si trova nel tuo CoreSimulator / Devices / appID / dati / ... cartella. Il file che stai cercando è db.realm.

Aprendolo, dovresti essere in grado non solo di visualizzare i tuoi dati, ma anche di modificare e aggiungere nuovi dati. Vai avanti e provalo!

Conclusione

In questo tutorial, hai imparato a conoscere Realm Mobile Database e perché è un potente strumento per lo sviluppatore iOS. Abbiamo anche brevemente toccato la sua controparte server, Realm Mobile Platform, che esamineremo in un tutorial separato.

Abbiamo quindi creato una semplice app per i promemoria basata su Realm Mobile Database. In poche decine di righe di codice, siamo stati in grado di:

  1. configurare un modello di oggetto dal vivo per il promemoria
  2. collegare il nostro controller di visualizzazione al modello di dati
  3. dichiarare, istanziare, caricare, aggiungere ed eliminare dal database di Realm

Infine, hai visto come utilizzare Realm Browser per eseguire il debug e visualizzare i tuoi dati.

Questa è stata un'introduzione molto semplice al Realm Mobile Database, ma puoi usarla come punto di partenza per intraprendere argomenti più avanzati. Come passi successivi, puoi guardare:

  • Il modello dei dati del regno
  • Documentazione per Realm per Swift
  • Documentazione per Realm per Objective-C 
  • Riferimento API di Realm Mobile Database

Assicurati di esplorare alcuni dei temi avanzati nella documentazione di cui sopra, come lavorare con le relazioni dati, testare oggetti Realm, threading e crittografia. 

E mentre sei qui, assicurati di controllare alcuni dei nostri altri post sullo sviluppo di app per iOS!