Compartilhar via


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