Partilhar via


Versões personalizadas do SQLite

Microsoft.Data.Sqlite é construído em cima de SQLitePCLRaw. Você pode usar versões personalizadas da biblioteca SQLite nativa usando um pacote ou configurando um SQLitePCLRaw provedor.

Pacotes

SQLitePCLRaw fornece pacotes baseados em conveniência, que facilitam a introdução das dependências certas em diferentes plataformas. O pacote principal Microsoft.Data.Sqlite inclui SQLitePCLRaw.bundle_e_sqlite3 por defeito. Para usar um pacote diferente, instale o Microsoft.Data.Sqlite.Core pacote junto com o pacote que você deseja usar. Os pacotes são inicializados automaticamente pelo 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. Esta é a predefinição.
SQLitePCLRaw.bundle_e_sqlcipher Fornece uma compilação não oficial e de código aberto do SQLCipher.
SQLitePCLRaw.bundle_green O mesmo que bundle_e_sqlite3, exceto no iOS, onde 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 as versões oficiais SQLCipher da Zetetic (não incluídas).

Por exemplo, para usar a compilação não oficial de código aberto de SQLCipher use os seguintes comandos.

dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.bundle_e_sqlcipher

Provedores disponíveis do SQLitePCLRaw

Quando não depender de um pacote, pode usar os fornecedores disponíveis do SQLite com a biblioteca central.

Fornecedor Descrição
SQLitePCLRaw.provider.dynamic O dynamic provedor carrega a biblioteca nativa em vez de usar System.Runtime.InteropServices.DllImportAttribute atributos. Para obter mais informações sobre como usar esse provedor, consulte Usar o provedor dinâmico.
SQLitePCLRaw.provider.e_sqlite3 O e_sqlite3 é o provedor padrão.
SQLitePCLRaw.provider.e_sqlcipher O e_sqlcipher provedor é o não oficial e sem suporte SQLCipher.
SQLitePCLRaw.provider.sqlite3 O sqlite3 provedor é fornecido pelo sistema SQLite para iOS, macOS e Linux.
SQLitePCLRaw.provider.sqlcipher O sqlcipher provedor é para compilações oficiais SQLCipher de Zetetic.
SQLitePCLRaw.provider.winsqlite3 O fornecedor winsqlite3 destina-se a ambientes Windows 10.

Para usar o sqlite3 provedor, 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 sqlite3 instância.

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 sua própria compilação do SQLite aproveitando o SQLitePCLRaw.provider.dynamic_cdecl pacote. 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 de qual plataforma .NET e tempo de execução 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;
}

Em seguida, configure o SQLitePCLRaw provedor. Certifique-se de que isso seja feito antes Microsoft.Data.Sqlite de ser usado em seu aplicativo. Além disso, evite usar um SQLitePCLRaw pacote agrupado que possa substituir o seu fornecedor de serviços.

SQLite3Provider_dynamic_cdecl
    .Setup("sqlite3", new NativeLibraryAdapter("sqlite3"));
SQLitePCL.raw.SetProvider(new SQLite3Provider_dynamic_cdecl());