カスタム 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 Windows 10 のシステム SQLite ライブラリである winsqlite3.dll が使用されます。
SQLitePCLRaw.bundle_zetetic Zetetic の公式の SQLCipher ビルドが使用されます (含まれていません)。

たとえば、オープン ソースの非公式の 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 プロバイダーは、iOS、macOS、Linux 用のシステム提供の SQLite です。
SQLitePCLRaw.provider.sqlcipher sqlcipher プロバイダーは、Zetetic からの公式 SQLCipher ビルド用です。
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}");
        }
    }
}

動的プロバイダーを使用する

SQLitePCLRaw.provider.dynamic_cdecl パッケージを利用すると、独自の SQLite ビルドを使用できます。 この場合、アプリとともにネイティブ ライブラリをデプロイする必要があります。 ただし、アプリとともにネイティブ ライブラリをデプロイする場合の詳細は、使用している .NET プラットフォームとランタイムによって大きく異なります。

まず、IGetFunctionPointer を実装する必要があります。 .NET Core での実装は次のようになります。

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

次に、SQLitePCLRaw プロバイダーを構成します。 これは、アプリで Microsoft.Data.Sqlite が使用される前に行ってください。 また、プロバイダーがオーバーライドされる可能性のある SQLitePCLRaw バンドル パッケージを使用しないようにしてください。

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