Confrontare le opzioni di archiviazione.
- 10 minuti
.NET Multi-platform App UI (MAUI) offre diverse opzioni di archiviazione per la memorizzazione nella cache dei dati in locale in un dispositivo, in base alla natura, alla struttura e alle dimensioni dei dati. Le tre opzioni più usate per l'archiviazione dei dati in locale in un'app .NET MAUI sono le seguenti:
- Preferenze: archivia i dati in coppie chiave-valore
- File system: archivia i file separati direttamente nel dispositivo tramite l'accesso al file system
- Database: archivia i dati in un database relazionale
In questa unità vengono esposte queste opzioni di archiviazione e le situazioni per cui ogni opzione è più appropriata.
Quando usare le preferenze
Le preferenze sono utili quando si lavora con semplici dati, ad esempio le selezioni degli utenti. Vengono spesso usate per consentire agli utenti di configurare l'applicazione. Tali dati vengono archiviati come set di coppie chiave/valore. Si supponga, ad esempio, che all'utente debba essere consentito di specificare se l'app deve salvare il nome utente e la password tra una sessione e l'altra. È possibile archiviare la scelta dell'utente in Preferenze.
Il seguente codice illustra come archiviare un valore booleano registrato nella variabile saveLoginDetails in una preferenza denominata SaveLogin e quindi leggere nuovamente i dati. Si noti che il metodo Get prevede di fornire un valore predefinito se non viene trovata la preferenza specificata:
bool saveLoginDetails = ...;
...
Preferences.Set("SaveLogin", saveLoginDetails);
...
var savedPreference = Preferences.Get("SaveLogin", false);
La classe Preferences contiene anche metodi per determinare l'esistenza di una preferenza denominata (ContainsKey), l'eliminazione di una preferenza (Remove) e la rimozione di tutti i dati delle preferenze (Clear).
Nota
È consigliabile archiviare solo tipi di dati semplici come preferenze. Non è possibile archiviare riferimenti a oggetti di grandi dimensioni come elenchi, raccolte e matrici. Per questo tipo di dati, usare il file system o un database.
Quando usare il file system
I dispositivi mobili e desktop dispongono di un file system con una struttura di directory gerarchica di file e cartelle. Il file system è molto utile quando si gestiscono file separati, ad esempio file di testo, binari o XML. Si supponga, ad esempio, di voler archiviare un file di log in locale nel dispositivo. È possibile creare un file di testo, salvarlo nel file system e scrivere i log al suo interno quando si verificano gli eventi. È anche possibile serializzare strutture di dati di grandi dimensioni in un file e memorizzarlo nella cache locale nel file system se è necessario salvare quando l'app viene chiusa. Al riavvio dell'app, è possibile rileggere questi dati nella memoria. Il codice seguente mostra esempi di serializzazione dei dati in un file e di salvataggio di quest'ultimo, quindi mostra esempi della lettura e della deserializzazione dei dati in un secondo momento in memoria. In questo caso si usa JSON per il formato di serializzazione, ma è possibile salvare i dati in qualsiasi formato che si ritiene più appropriato per la natura dei dati e i requisiti di sicurezza dell'app.
using System.Text.Json;
using System.IO;
// Data to be written to the file system, and read back later
List<Customer> customers = ...;
// Serialize and save
string fileName = ...;
var serializedData = JsonSerializer.Serialize(customers);
File.WriteAllText(fileName, serializedData);
...
// Read and deserialize
var rawData = File.ReadAllText(fileName);
customers = JsonSerializer.Deserialize<List<Customer>>(rawData);
Accedere alla sandbox app
Quando si lavora con file separati, ad esempio file XML, è necessario archiviarli in un percorso appropriato nel file system. Alcuni di questi dati potrebbero essere sensibili e non si vuole salvarli in una posizione in cui altre app o utenti possono accedervi facilmente. Le app MAUI .NET forniscono la sandbox dell'app. La sandbox dell'app è un'area privata con cui l'applicazione può lavorare. Per impostazione predefinita, nessun'altra applicazione, a parte il sistema operativo stesso, può accedere a tale area. È possibile accedere alla sandbox usando la proprietà statica AppDataDirectory della classe FileSystem:
string path = FileSystem.AppDataDirectory;
In questo codice, la variabile path contiene il percorso del file nel percorso in cui è possibile archiviare i file per l'applicazione da usare. È possibile leggere e scrivere dati in file in questa cartella usando le tecniche illustrate nella sezione Quando usare il file system .
Nota
La proprietà FileSystem.AppDataDirectory è un'astrazione di un percorso specifico del dispositivo e restituisce cartelle diverse in Android, iOS e WinUI3. Tale astrazione consente di scrivere codice che fa riferimento alla sandbox in modo indipendente dalla piattaforma su cui viene eseguito. Usare questa astrazione piuttosto che fare riferimento esplicitamente a un percorso specifico del dispositivo nel codice.
Linee guida per il salvataggio dei dati nelle app iOS
Apple mette a disposizione indicazioni per iOS relativamente alla posizione in cui devono essere archiviati i file. Per impostazione predefinita, sono presenti due percorsi di cartelle principali.
Cartella Libreria: come descritto in precedenza, la
FileSystem.AppDataDirectoryproprietà restituisce questa cartella. Usare la cartella Libreria per archiviare i dati generati dall'applicazione.Cartella Documenti: il frammento di codice seguente illustra come fare riferimento a questa cartella nella
docFoldervariabile . Usare la cartella Documenti per archiviare solo i dati generati dall'utente. Si tratta di dati creati in risposta diretta a un'azione dell'utente. Se ad esempio si crea un'applicazione di modifica del testo come Microsoft Word, il documento verrà archiviato nella cartella Documenti.string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
Quando usare un database
È consigliabile usare un database locale in presenza di relazioni tra i dati o quando si vogliono filtrare i dati nel corso del tempo. Nel caso dell'applicazione di social media, ad esempio, ogni post contiene i dati relativi al post stesso, come il timestamp e il contenuto. Ogni post, tuttavia, ha anche una relazione con un utente che ha creato il post. Può essere opportuno rappresentare questa relazione in un database per evitare la duplicazione dei dati tra i post, oltre che per migliorare l'efficienza della ricerca dei dati.
Un database SQLite è un file che è necessario archiviare in una posizione appropriata. Idealmente, è consigliabile creare una cartella sotto la cartella AppDataDirectory nella sandbox e creare il database in questa cartella.