domingo, 26 de abril de 2015

Acessando o SQLite a partir de uma PCL e uma aplicação Windows Phone 8.1

Recentemente precisei acessar o SQLite a partir de uma Portable Class Library, por sua vez acessada por uma aplicação Windows Phone 8.1.

Passei por um bom perrengue até conseguir colocar a coisa toda pra funcionar e por essa razão decidi documentar o passo a passo para a solução final. Segue abaixo:

1) No assembly PCL em que você deseja acessar o SQLite, referencie o pacote NuGet "SQLitePCL.raw_basic". Este pacote fornece acesso ao SQLite sem conter o SQLite em si e portanto é independente de plataforma, podendo ser usado numa PCL. Ele não será usado em tempo de execução, mas permitirá que sua solução compile sem problemas.

2) Ainda no mesmo assembly, referencie o pacote "SQLite-net PCL". Esse pacote é quem fornece a API .NET que você utilizará para acessar o SQLite, como o objeto SQLiteConnection, por exemplo. Internamente, ele acessa o "SQLitePCL.raw" que é o pacote que de fato acessa a 'sqlite3.dll'.

3) No projeto que irá consumir a sua PCL, referencie o pacote NuGet "SQLitePCL.raw". Esse pacote vem com versões específicas para cada plataforma e apenas aquela referente à plataforma do seu projeto será utilizada. É este também o pacote que trás consigo a biblioteca 'sqlite3.dll'.

4) Por alguma razão que não consegui descobrir qual seja, ao compilar e executar o projeto neste ponto, quando tudo já deveria estar funcionando, o runtime informa que a 'sqlite3.dll' não pode ser carregada, mesmo ela estando presente junto aos binários do projeto. A forma como resolvi esse problema foi adicionar, e em seguida remover, uma referência ao pacote oficial do SQLite para Windows Phone 8.1. É necessário remover a referência após adicioná-la pois caso contrário o compilador irá reclamar de duplicidade da biblioteca 'sqlite3.dll', presente nessa extensão, com a outra, disponível no pacote "SQLitePCL.raw". Após esse 'recurso técnico' ser aplicado, tudo parece passar a funcionar sem problemas, mesmo após apagar completamente os binários do projeto e compilar novamente (sem repetir a gambiarra com o pacote oficial).

Escrevi uma breve aplicação para ilustrar essa solução.

Nenhum comentário:

Postar um comentário