Versões personalizadas do SQLite
Microsoft.Data.Sqlite
é criado com base no SQLitePCLRaw
. Você pode usar versões personalizadas da biblioteca nativa do SQLite usando um pacote ou configurando um provedor SQLitePCLRaw
.
Pacotes
SQLitePCLRaw
fornece conjuntos de pacotes baseados em conveniência, que facilitam a entrada das dependências certas em diferentes plataformas. O pacote Microsoft.Data.Sqlite
principal traz SQLitePCLRaw.bundle_e_sqlite3
por padrão. Para usar um pacote diferente, instale o pacote Microsoft.Data.Sqlite.Core
com o conjunto de pacotes que você quer usar. Os pacotes são inicializados automaticamente por Microsoft.Data.Sqlite
.
Pacote | Descrição |
---|---|
SQLitePCLRaw.bundle_e_sqlite3 | Fornece uma versão consistente do SQLite em todas as plataformas. Inclui as extensões FTS4, FTS5, JSON1 e R*Tree. Esse é o padrão. |
SQLitePCLRaw.bundle_e_sqlcipher | Fornece um build não oficial de software livre de SQLCipher . |
SQLitePCLRaw.bundle_green | O mesmo que bundle_e_sqlite3 , exceto no iOS em que ele usa a biblioteca SQLite do sistema. |
SQLitePCLRaw.bundle_sqlite3 | Usa a biblioteca SQLite do sistema. |
SQLitePCLRaw.bundle_winsqlite3 | Usa winsqlite3.dll , a biblioteca SQLite do sistema no Windows 10. |
SQLitePCLRaw.bundle_zetetic | Usa os builds SQLCipher oficiais do Zetetic (não incluídos). |
Por exemplo, para usar o build não oficial de software livre de SQLCipher
, use os comandos a seguir.
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher
Provedores disponíveis do SQLitePCLRaw
Ao não depender de um pacote, você pode usar os provedores disponíveis do SQLite com o assembly principal.
Provedor | Descrição |
---|---|
SQLitePCLRaw.provider.dynamic | O provedor dynamic carrega a biblioteca nativa em vez de usar atributos System.Runtime.InteropServices.DllImportAttribute. Para mais informações sobre como usar esse provedor, confira Usar o provedor dinâmico. |
SQLitePCLRaw.provider.e_sqlite3 | O e_sqlite3 é o provedor padrão. |
SQLitePCLRaw.provider.e_sqlcipher | O provedor e_sqlcipher é o SQLCipher não oficial e sem suporte. |
SQLitePCLRaw.provider.sqlite3 | O provedor sqlite3 é um SQLite fornecido pelo sistema para iOS, macOS e Linux. |
SQLitePCLRaw.provider.sqlcipher | O provedor sqlcipher é para builds do SQLCipher oficiais de Zetetic . |
SQLitePCLRaw.provider.winsqlite3 | O provedor winsqlite3 é para ambientes Windows 10. |
Para usar o provedor sqlite3
, use os seguintes comandos:
dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.core
dotnet add package SQLitePCLRaw.provider.sqlite3
Com os pacotes instalados, você define o provedor para a instância sqlite3
.
using Microsoft.Data.Sqlite;
using System;
namespace SqliteProviderSample
{
class Program
{
static void Main()
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_sqlite3());
using var connection = new SqliteConnection();
Console.WriteLine($"System SQLite version: {connection.ServerVersion}");
}
}
}
Usar o provedor dinâmico
Você pode usar um build do SQLite próprio aproveitando o pacote SQLitePCLRaw.provider.dynamic_cdecl
. Nesse caso, você é responsável por implantar a biblioteca nativa com seu aplicativo. Observe que os detalhes da implantação de bibliotecas nativas com seu aplicativo variam consideravelmente dependendo da plataforma .NET e do runtime que você está usando.
Primeiro, você precisará implementar IGetFunctionPointer
. A implementação no .NET Core é a seguinte:
class NativeLibraryAdapter : IGetFunctionPointer
{
readonly IntPtr _library;
public NativeLibraryAdapter(string name)
=> _library = NativeLibrary.Load(name);
public IntPtr GetFunctionPointer(string name)
=> NativeLibrary.TryGetExport(_library, name, out var address)
? address
: IntPtr.Zero;
}
Então configure o provedor SQLitePCLRaw
. Verifique se isso é feito antes de Microsoft.Data.Sqlite
ser usado em seu aplicativo. Além disso, evite usar um conjunto de pacotes SQLitePCLRaw
que possa substituir seu provedor.
SQLite3Provider_dynamic_cdecl
.Setup("sqlite3", new NativeLibraryAdapter("sqlite3"));
SQLitePCL.raw.SetProvider(new SQLite3Provider_dynamic_cdecl());