Поделиться через


Пользовательские версии SQLite

Microsoft.Data.Sqlite создается на основе SQLitePCLRaw. Чтобы использовать настраиваемые версии нативной библиотеки SQLite, используйте пакет или настройте поставщика SQLitePCLRaw.

Наборы

SQLitePCLRaw предоставляет удобные комплекты пакетов, которые упрощают применение подходящих зависимостей на различных платформах. Основной пакет Microsoft.Data.Sqlite по умолчанию добавляет SQLitePCLRaw.bundle_e_sqlite3. Чтобы использовать другой пакет, установите пакет Microsoft.Data.Sqlite.Core вместе с нужным вам пакетом. Пакеты автоматически инициализируются с помощью Microsoft.Data.Sqlite.

Пакет Описание
SQLitePCLRaw.bundle_e_sqlite3 Предоставляет согласованные версии SQLite для всех платформ. Включает расширения FTS4, FTS5, JSON1 и R*Tree. Это значение по умолчанию.
SQLitePCLRaw.bundle_e_sqlcipher Предоставляет неофициальную сборку SQLCipher с открытым кодом.
SQLitePCLRaw.bundle_green Аналогично bundle_e_sqlite3, за исключением платформы iOS, где используется системная библиотека SQLite.
SQLitePCLRaw.bundle_sqlite3 Использует системную библиотеку SQLite.
SQLitePCLRaw.bundle_winsqlite3 Использует winsqlite3.dll, то есть системную библиотеку SQLite на платформе Windows 10.
SQLitePCLRaw.bundle_zetetic Использует официальные сборки SQLCipher, предоставляемые Zetetic (не входят в пакет).

Например, следующие команды позволяют применить неофициальную сборку SQLCipher с открытым кодом:

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

Поставщики SQLitePCLRaw: доступные варианты

Если нет желания использовать пакет, вы можете использовать доступные поставщики SQLite с основной сборкой.

Поставщик Описание
SQLitePCLRaw.provider.dynamic Поставщик dynamic загружает собственную библиотеку вместо использования атрибутов System.Runtime.InteropServices.DllImportAttribute. Дополнительные сведения об использовании этого поставщика см. в используйте динамического поставщика.
SQLitePCLRaw.provider.e_sqlite3 e_sqlite3 является поставщиком по умолчанию.
SQLitePCLRaw.provider.e_sqlcipher Поставщик e_sqlcipher — это неофициальный и неподдерживаемый провайдер SQLCipher.
SQLitePCLRaw.provider.sqlite3 Поставщик sqlite3 — это системный компонент SQLite для iOS, macOS и Linux.
SQLitePCLRaw.provider.sqlcipher Поставщик sqlcipher предназначен для официальных сборок SQLCipher от Zetetic.
SQLitePCLRaw.provider.winsqlite3 Поставщик winsqlite3 предназначен для сред Windows 10.

Для использования поставщика sqlite3 примените следующие команды:

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

После установки пакетов настройте экземпляр 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}");
        }
    }
}

Использование динамического поставщика

Вы можете использовать собственную сборку SQLite, применяя пакет SQLitePCLRaw.provider.dynamic_cdecl. В этом случае вы обязаны самостоятельно развертывать нативную библиотеку совместно с приложением. Обратите внимание, что процедура развертывания нативных библиотек вместе с приложением будет существенно различаться на разных платформах .NET и в разных средах выполнения.

Прежде всего нужно реализовать IGetFunctionPointer. Ниже приведены сведения о такой реализации на .NET Core.

class NativeLibraryAdapter : IGetFunctionPointer
{
    readonly IntPtr _library;

    public NativeLibraryAdapter(string name)
        => _library = SQLitePCL.NativeLibrary.Load(name);

    public IntPtr GetFunctionPointer(string name)
        => SQLitePCL.NativeLibrary.TryGetExport(_library, name, out var address)
            ? address
            : IntPtr.Zero;
}

Далее настройте поставщик SQLitePCLRaw. Это нужно сделать до того, как в приложении будет использоваться Microsoft.Data.Sqlite. Также избегайте использования пакета SQLitePCLRaw, который может переопределить вашего провайдера.

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