Konfigurowanie biblioteki SQLite na platformie Xamarin.iOS

Aby użyć biblioteki SQLite w aplikacji platformy Xamarin.iOS, należy określić poprawną lokalizację pliku bazy danych.

Ścieżka pliku bazy danych

Niezależnie od używanej metody dostępu do danych, należy utworzyć plik bazy danych, aby dane mogły być przechowywane za pomocą biblioteki SQLite. W zależności od platformy docelowej lokalizacja pliku będzie inna. W przypadku systemu iOS można użyć klasy Environment do skonstruowania prawidłowej ścieżki, jak pokazano w poniższym fragmencie kodu:

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

Podczas podejmowania decyzji o miejscu przechowywania pliku bazy danych należy wziąć pod uwagę inne kwestie. W systemie iOS możesz chcieć automatycznie utworzyć kopię zapasową bazy danych (lub nie).

Jeśli chcesz użyć innej lokalizacji na każdej platformie w aplikacji dla wielu platform, możesz użyć dyrektywy kompilatora, jak pokazano, aby wygenerować inną ścieżkę dla każdej platformy:

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

Zapoznaj się z artykułem Praca z systemem plików, aby uzyskać więcej informacji na temat lokalizacji plików do użycia w systemie iOS. Zobacz dokument Building Cross Platform Applications (Tworzenie aplikacji międzyplatformowych), aby uzyskać więcej informacji na temat używania dyrektyw kompilatora do pisania kodu specyficznego dla każdej platformy.

Wątkowość

Nie należy używać tego samego połączenia bazy danych SQLite w wielu wątkach. Należy zachować ostrożność podczas otwierania, użyć polecenia , a następnie zamknąć wszystkie połączenia utworzone w tym samym wątku.

Aby upewnić się, że kod nie próbuje uzyskać dostępu do bazy danych SQLite z wielu wątków jednocześnie, ręcznie wykonaj blokadę za każdym razem, gdy będziesz uzyskiwać dostęp do bazy danych, w następujący sposób:

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

Cały dostęp do bazy danych (odczyty, zapisy, aktualizacje itp.) powinien być opakowany tą samą blokadą. Należy zachować ostrożność, aby uniknąć sytuacji zakleszczenia, zapewniając, że praca wewnątrz klauzuli blokady jest prosta i nie wywołuje innych metod, które mogą również mieć blokadę!