Konfigurieren von SQLite in Xamarin.iOS

Um SQLite in Ihrer Xamarin.iOS-Anwendung verwenden zu können, müssen Sie den richtigen Dateispeicherort für Ihre Datenbankdatei ermitteln.

Datenbankdateipfad

Unabhängig davon, welche Datenzugriffsmethode Sie verwenden, müssen Sie eine Datenbankdatei erstellen, bevor Daten mit SQLite gespeichert werden können. Je nachdem, welche Plattform Sie als Ziel verwenden, ist der Dateispeicherort unterschiedlich. Für iOS können Sie die Environment-Klasse verwenden, um einen gültigen Pfad zu erstellen, wie im folgenden Codeausschnitt gezeigt:

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

Bei der Entscheidung, wo die Datenbankdatei gespeichert werden soll, sind noch weitere Aspekte zu berücksichtigen. Unter iOS möchten Sie möglicherweise, dass die Datenbank automatisch gesichert wird (oder nicht).

Wenn Sie einen anderen Speicherort auf jeder Plattform in Ihrer plattformübergreifenden Anwendung verwenden möchten, können Sie eine Compilerdirektive wie gezeigt verwenden, um einen anderen Pfad für jede Plattform zu generieren:

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);

Weitere Informationen dazu, welche Dateispeicherorte unter iOS verwendet werden sollen, finden Sie im Artikel Arbeiten mit dem Dateisystem . Weitere Informationen zur Verwendung von Compilerdirektiven zum Schreiben von Code, der für jede Plattform spezifisch ist, finden Sie im Dokument Erstellen plattformübergreifender Anwendungen .

Threading

Sie sollten nicht dieselbe SQLite-Datenbankverbindung über mehrere Threads hinweg verwenden. Achten Sie darauf, alle Verbindungen, die Sie mit demselben Thread erstellen, zu öffnen, zu verwenden und dann zu schließen.

Um sicherzustellen, dass Ihr Code nicht versucht, von mehreren Threads gleichzeitig auf die SQLite-Datenbank zuzugreifen, nehmen Sie eine Sperre wie folgt vor, wenn Sie auf die Datenbank zugreifen:

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

Alle Datenbankzugriffe (Lesevorgänge, Schreibvorgänge, Updates usw.) sollten mit derselben Sperre umschlossen werden. Es muss darauf geachtet werden, eine Deadlocksituation zu vermeiden, indem sichergestellt wird, dass die Arbeit innerhalb der Sperrklausel einfach bleibt und nicht auf andere Methoden hinweist, die möglicherweise auch eine Sperre annehmen!