Share via


Configurando o SQLite no Xamarin.iOS

Para usar o SQLite em seu aplicativo Xamarin.iOS, você precisará determinar o local do arquivo correto para o arquivo de banco de dados.

Caminho do arquivo de banco de dados

Independentemente do método de acesso a dados usado, você deve criar um arquivo de banco de dados antes que os dados possam ser armazenados com o SQLite. Dependendo de qual plataforma você está direcionando o local do arquivo será diferente. Para iOS, você pode usar a classe Environment para construir um caminho válido, conforme mostrado no seguinte snippet de código:

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

Há outras coisas a serem consideradas ao decidir onde armazenar o arquivo de banco de dados. No iOS, talvez você queira que o banco de dados faça backup automaticamente (ou não).

Se você quiser usar um local diferente em cada plataforma em seu aplicativo multiplataforma, poderá usar uma diretiva do compilador, conforme mostrado para gerar um caminho diferente para cada plataforma:

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

Consulte o artigo Trabalhando com o sistema de arquivos para obter mais informações sobre quais locais de arquivo usar no iOS. Consulte o documento Criando aplicativos multiplataforma para obter mais informações sobre como usar diretivas do compilador para escrever código específico para cada plataforma.

Threading

Você não deve usar a mesma conexão de banco de dados SQLite em vários threads. Tenha cuidado para abrir, usar e fechar todas as conexões criadas no mesmo thread.

Para garantir que seu código não esteja tentando acessar o banco de dados SQLite de vários threads ao mesmo tempo, use manualmente um bloqueio sempre que você acessar o banco de dados, desta forma:

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

Todo o acesso ao banco de dados (leituras, gravações, atualizações etc.) deve ser encapsulado com o mesmo bloqueio. É necessário ter cuidado para evitar uma situação de deadlock, garantindo que o trabalho dentro da cláusula de bloqueio seja mantido simples e não chame outros métodos que também podem ter um bloqueio!