Dati principali vs. NSKeyedArchiver vs. Default utente

I dati principali, NSKeyedArchiver e UserDefaults sono tre modi in cui un programmatore può conservare i dati tra i lanci di app. Sebbene i dati di base siano leggermente più complicati, è utile quando le informazioni memorizzate richiedono struttura. NSKeyedArchiver è meno complesso e più lento dei dati di base, ma è molto più semplice da usare. UserDefaults è il metodo più semplice per conservare i dati.

Dati di base

I principali vantaggi dei dati di base includono:

  1. capacità di interrogare in modo efficiente
  2. i dati sono strutturati in modo tale che ogni entità abbia determinati attributi (pensa a proprietà con tipi specifici) e può o meno essere correlata ad altre entità attraverso relazioni
  3. migrazioni automatiche: fondamentalmente questo significa solo quando si crea un modello di dati di base, viene creato un database SQLite. Se successivamente si modifica il modello di dati (es. Aggiungere altri attributi al modello di dati), il nuovo modello di dati non è compatibile con l'archivio permanente originale. Apple gestisce questa "migrazione" da una versione del modello di dati a un'altra per noi - grazie Apple !!

Prima di scavare nel codice, esaminiamo alcune definizioni:

  1. NSPersistentContainer è responsabile della lettura / scrittura dei dati principali.
  2. viewContext di tipo NSManagedObjectContext. Si crea un'istanza di un oggetto dati core tramite NSManagedObjectContext.

Per integrare i dati di base nel progetto, è necessario innanzitutto creare un file .xcdatamodel di dati di base. All'interno di questo file definirai le entità, inclusi gli attributi di ciascuna entità, che desideri persistere. Dopo aver creato il file .xcdatamodel, quindi aggiungere un nuovo file .swift al progetto che includerà tutto il codice della piastra della caldaia per i dati del codice. Tre cose da notare nel codice qui sotto -

  1. il nome NSPeristentContainer DEVE essere uguale al file .xcdatamodel.
  2. Ho creato un singleton in modo che durante l'intero corso dell'app ci sia una sola istanza delle informazioni salvate attraverso i dati di base. Se sei curioso di conoscere singoli / modelli di design in generale, dai un'occhiata a questo blog.
  3. Non dimenticare di importare CoreData nel file .swift!

* Se si crea un nuovo progetto e si sceglie di aggiungere i dati principali al progetto, il codice della piastra della caldaia sopra verrà visualizzato nel delegato dell'app.

Oltre al salvataggio dei dati, è probabile che tu voglia anche recuperare quei dati per popolare la tua app al successivo avvio dell'app. Supponiamo che tu abbia creato un'entità nel file .xcdatamodel chiamato "Book". Come puoi vedere nel codice seguente, recuperi i dati utilizzando NSFetchRequest. Ho creato una matrice, denominata "Libri", che è uguale a [Libro] (), che significa una matrice dell'entità Libro. Ogni volta che voglio popolare la mia app con questi dati salvati, invoco questa funzione CoreDataModel.sharedInstance.fetchWorkoutData () e imposto i dati con cui voglio lavorare uguale a CoreDataModel.sharedInstance.books.

Anche la rimozione di informazioni dai dati di base è molto semplice: tutto ciò che devi fare è recuperare le informazioni memorizzate ed eseguire l'iterazione attraverso l'array ed eliminare ogni oggetto dal contenitore persistente. Ecco!

Non ho approfondito le relazioni in questo post, ma il blog seguente si tuffa nella scrittura del codice per le relazioni nei dati di base.

NSKeyedArchiver

NSKeyedArchiver offre la possibilità di interagire direttamente con il disco. In particolare, serializza NSCoding, che è un protocollo con due metodi:

  1. codifica (con aCoder: NSCoder)
  2. init? (codificatore aDecoder: NSCoder)

Nell'esempio seguente, il mio obiettivo è quello di persistere un array di [Person]. Class Person ha due proprietà: firstName (di tipo String) e lastName (di tipo String). Come puoi vedere dal codice seguente, la classe Person adotta e si conforma al protocollo NSCoding.

La memorizzazione e il recupero dei dati tramite NSKeyedArchiver è molto semplice. Quando desideri archiviare informazioni, puoi semplicemente chiamare NSKeyedArchiver.archiveRootObject: questo è un metodo integrato.

Allo stesso modo, quando si desidera recuperare dati permanenti, è possibile chiamare un'altra funzione incorporata, NSKeyedUnarchiver.unarchiveObject.

Come puoi vedere, NSKeyedArchiver è molto più semplice da implementare rispetto ai Core Data ed è un'opzione interessante per conservare i dati.

Impostazioni predefinite dell'utente

UserDefaults è una classe che consente la memorizzazione semplice di diversi tipi di dati. Viene utilizzato principalmente per archiviare piccole quantità di dati che persistono tra il lancio di app o il riavvio del dispositivo. UserDefaults può memorizzare tipi di base (bool, float, double, int, ecc.) E tipi più complessi (array, dizionario). Sebbene UserDefaults non abbia una struttura, si dice che sia più veloce dei dati di base perché tutto ciò che sono sono coppie chiave-valore. Poiché non ha struttura, è utile archiviare dati che non richiedono struttura, quindi le preferenze dell'utente.

Una cosa da notare è che se si reimposta una chiave, i dati salvati verranno sostituiti TUTTAVIA entrambe le chiavi DEVONO ESSERE STESSE - se una chiave ha tutte le lettere minuscole e la seconda chiave ha una lettera maiuscola, i dati esistenti non verranno sostituiti.

Grazie per la lettura e buona programmazione !!

Riferimenti:

https://www.hackingwithswift.com/example-code/system/how-to-save-user-settings-using-userdefaults