Condividi tramite


Configurazione di SQLite in Xamarin.iOS

Per usare SQLite nell'applicazione Xamarin.iOS, è necessario determinare il percorso del file corretto per il file di database.

Percorso file di database

Indipendentemente dal metodo di accesso ai dati usato, è necessario creare un file di database prima che i dati possano essere archiviati con SQLite. A seconda della piattaforma di destinazione del percorso del file, sarà diversa. Per iOS è possibile usare la classe Environment per costruire un percorso valido, come illustrato nel frammento di codice seguente:

string dbPath = Path.Combine (
        Environment.GetFolderPath (Environment.SpecialFolder.Personal),
        "database.db3");
// dbPath contains a valid file path for the database file to be stored

Quando si decide dove archiviare il file di database, è necessario prendere in considerazione altri aspetti. In iOS può essere necessario eseguire automaticamente il backup del database (o meno).

Se si vuole usare una posizione diversa in ogni piattaforma nell'applicazione multipiattaforma, è possibile usare una direttiva del compilatore come illustrato per generare un percorso diverso per ogni piattaforma:

var sqliteFilename = "MyDatabase.db3";
#if __ANDROID__
// Just use whatever directory SpecialFolder.Personal returns
string libraryPath = Environment.GetFolderPath(Environment.SpecialFolder.Personal); ;
#else
// we need to put in /Library/ on iOS5.1+ to meet Apple's iCloud terms
// (they don't want non-user-generated data in Documents)
string documentsPath = Environment.GetFolderPath (Environment.SpecialFolder.Personal); // Documents folder
string libraryPath = Path.Combine (documentsPath, "..", "Library"); // Library folder instead
#endif
var path = Path.Combine (libraryPath, sqliteFilename);

Per altre informazioni sui percorsi dei file da usare in iOS, vedere l'articolo Uso del file system . Per altre informazioni sull'uso delle direttive del compilatore per scrivere codice specifico per ogni piattaforma, vedere il documento Building Cross Platform Applications (Compilazione di applicazioni multipiattaforma).

Threading

Non usare la stessa connessione di database SQLite tra più thread. Prestare attenzione ad aprire, usare e quindi chiudere le connessioni create nello stesso thread.

Per assicurarsi che il codice non tenti di accedere al database SQLite da più thread contemporaneamente, eseguire manualmente un blocco ogni volta che si accede al database, come illustrato di seguito:

object locker = new object(); // class level private field
// rest of class code
lock (locker){
    // Do your query or insert here
}

Tutti gli accessi al database (letture, scritture, aggiornamenti e così via) devono essere inclusi nello stesso blocco. È necessario prestare attenzione a evitare una situazione di deadlock assicurandosi che il lavoro all'interno della clausola di blocco sia mantenuto semplice e non chiami altri metodi che possono anche accettare un blocco.