Condividi tramite


Versioni di SQLite personalizzate

Microsoft.Data.Sqlite è basato su SQLitePCLRaw. È possibile usare versioni personalizzate della libreria SQLite nativa, usando un bundle o configurando un provider di SQLitePCLRaw.

Aggregazioni

SQLitePCLRaw fornisce pacchetti bundle basati sulla convenienza, che semplificano l'inserimento delle dipendenze corrette su piattaforme diverse. Il pacchetto principale Microsoft.Data.Sqlite porta in SQLitePCLRaw.bundle_e_sqlite3 per impostazione predefinita. Per usare un bundle diverso, installare il pacchetto Microsoft.Data.Sqlite.Core insieme al pacchetto bundle da usare. I bundle vengono inizializzati automaticamente da Microsoft.Data.Sqlite.

Aggregazione Descrizione
SQLitePCLRaw.bundle_e_sqlite3 Fornisce una versione coerente di SQLite in tutte le piattaforme. Include le estensioni FTS4, FTS5, JSON1 e R*Tree. Si tratta dell'impostazione predefinita.
SQLitePCLRaw.bundle_e_sqlcipher Fornisce una compilazione open source non ufficiale di SQLCipher.
SQLitePCLRaw.bundle_green Come per bundle_e_sqlite3, ma su iOS usa la libreria SQLite di sistema.
SQLitePCLRaw.bundle_sqlite3 Usa la libreria SQLite di sistema.
SQLitePCLRaw.bundle_winsqlite3 Usa winsqlite3.dll, la libreria SQLite di sistema in Windows 10.
SQLitePCLRaw.bundle_zetetic Usa le build ufficiali SQLCipher da Zetetic (non incluse).

Ad esempio, per usare la build open-source non ufficiale di SQLCipher, usare i comenti seguenti.

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

Provider disponibili SQLitePCLRaw

Quando non si fa affidamento su un bundle, è possibile usare i provider disponibili di SQLite con l'assembly principale.

Provider Descrizione
SQLitePCLRaw.provider.dynamic Il provider di dynamic carica la libreria nativa anziché usare gli attributi System.Runtime.InteropServices.DllImportAttribute. Per altre informazioni sull'uso di questo provider, vedere usare il provider dinamico.
SQLitePCLRaw.provider.e_sqlite3 e_sqlite3 è il provider predefinito.
SQLitePCLRaw.provider.e_sqlcipher Il provider di e_sqlcipher è la versione non ufficiale e non supportata di SQLCipher.
SQLitePCLRaw.provider.sqlite3 Il provider di sqlite3 è un SQLite fornito dal sistema per iOS, macOS e Linux.
SQLitePCLRaw.provider.sqlcipher Il provider di sqlcipher è destinato alle build ufficiali di SQLCipher da Zetetic.
SQLitePCLRaw.provider.winsqlite3 Il provider di winsqlite3 è destinato agli ambienti Windows 10.

Per usare il provider di sqlite3 usare i comandi seguenti:

dotnet add package Microsoft.Data.Sqlite.Core
dotnet add package SQLitePCLRaw.core
dotnet add package SQLitePCLRaw.provider.sqlite3

Dopo aver installato i pacchetti, impostare il provider sull'istanza di 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}");
        }
    }
}

Usare il provider dinamico

È possibile usare la propria build di SQLite sfruttando il pacchetto SQLitePCLRaw.provider.dynamic_cdecl. In questo caso, l'utente è responsabile della distribuzione della libreria nativa con la propria app. Si noti che i dettagli della distribuzione delle librerie native con l'app variano notevolmente a seconda della piattaforma .NET e del runtime in uso.

Prima di tutto, è necessario implementare IGetFunctionPointer. L'implementazione in .NET Core è la seguente:

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

Configurare quindi il provider di SQLitePCLRaw. Assicurarsi che questa operazione venga eseguita prima che Microsoft.Data.Sqlite venga usato nell'app. Evitare inoltre di usare un pacchetto bundle SQLitePCLRaw che potrebbe eseguire l'override del provider.

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