Настройка SQLite в Xamarin.iOS

Чтобы использовать SQLite в приложении Xamarin.iOS, необходимо определить правильное расположение файла базы данных.

Путь к файлу базы данных

Независимо от того, какой метод доступа к данным используется, необходимо создать файл базы данных перед сохранением данных с помощью SQLite. В зависимости от того, какая платформа ориентирована на расположение файла, будет отличаться. Для iOS можно использовать класс Environment для создания допустимого пути, как показано в следующем фрагменте кода:

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

При выборе места хранения файла базы данных следует учитывать другие аспекты. В iOS может потребоваться, чтобы база данных автоматически выполнялась резервное копирование (или нет).

Если вы хотите использовать другое расположение на каждой платформе в кроссплатформенное приложение, можно использовать директиву компилятора, как показано, чтобы создать другой путь для каждой платформы:

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

Дополнительные сведения о расположениях файлов для iOS см. в статье "Работа с файловой системой". Дополнительные сведения об использовании директив компилятора для написания кода для каждой платформы см. в документе "Сборка кроссплатформенных приложений ".

Потоки

Не следует использовать одно и то же подключение к базе данных SQLite в нескольких потоках. Будьте осторожны, чтобы открыть, использовать и закрыть все подключения, создаваемые в одном потоке.

Чтобы убедиться, что код не пытается получить доступ к базе данных SQLite из нескольких потоков одновременно, вручную выполните блокировку при каждом обращении к базе данных, как показано ниже.

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

Доступ ко всем базам данных (операции чтения, записи, обновления и т. д.) должен быть упакован с одной блокировкой. Будьте внимательны, чтобы избежать ситуации взаимоблокировки, гарантируя, что работа внутри предложения блокировки остается простой и не вызывает другие методы, которые также могут взять блокировку!