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

Использовать SQLite в приложении Xamarin.iOS, вам потребуется определить правильное расположение файла для файла базы данных.To use SQLite in your Xamarin.iOS application you will need to determine the correct file location for your database file.

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

Независимо от того, какой используется метод доступа к данным необходимо создать файл базы данных, прежде чем данные могут храниться с SQLite.Regardless of which data access method you use, you must create a database file before data can be stored with SQLite. В зависимости от целевой платформы будет отличаться нужный файл.Depending on what platform you are targeting the file location will be different. Для iOS класс среды можно использовать для создания допустимым путем, как показано в следующем фрагменте кода:For iOS you can use Environment class to construct a valid path, as shown in the following code snippet:

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

Имеется ряд других вещей, необходимо учитывать при выборе места для хранения файла базы данных.There are other things to take into consideration when deciding where to store the database file. На устройствах iOS можно базы данных, чтобы резервные копии автоматически (или нет).On iOS you may want the database to backed-up automatically (or not).

Если вы хотите использовать в другое место на каждой платформе в кроссплатформенного приложения можно использовать директивы компилятора как показано для создания другой путь для каждой платформы:If you wish to use a different location on each platform in your cross platform application you can use a compiler directive as shown to generate a different path for each platform:

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.Refer to the Working with the File System article for more information on what file locations to use on iOS. См. в разделе Создание межплатформенных приложений платформы Дополнительные сведения об использовании директивы компилятора для написание кода специально для каждой платформы.See the Building Cross Platform Applications document for more information on using compiler directives to write code specific to each platform.

ПотокиThreading

Не следует использовать то же подключение базы данных SQLite в нескольких потоках.You should not use the same SQLite database connection across multiple threads. Следите за тем открыть, использовать и затем закройте все подключения, которые создаются на том же потоке.Be careful to open, use and then close any connections you create on the same thread.

Чтобы убедиться, что ваш код не пытается получить доступ к базе данных SQLite из нескольких потоков одновременно, вручную установить блокировку всякий раз, когда вы будете обращаться к базе данных, следующим образом:To ensure that your code is not attempting to access the SQLite database from multiple threads at the same time, manually take a lock whenever you are going to access the database, like this:

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

Все доступа к базе данных (операций чтения, записи, обновления, и т.д) должен быть заключен в ту же блокировку.All database access (reads, writes, updates, etc) should be wrapped with the same lock. Будьте осторожны, гарантируя, что работа в предложении блокировки хранится простой и не вызывать другие методы, которые также могут установить блокировку во избежание взаимоблокировки!Care must be taken to avoid a deadlock situation by ensuring that the work inside the lock clause is kept simple and does not call out to other methods that may also take a lock!