Uno PlatformでSQLiteを使う
NuGetパッケージ
SQLite APIを使いたいプロジェクトにMicrosoft.EntityFrameworkCore.Sqliteを導入します。サンプルアプリでは、DBアクセスのコードを「SQLiteSample」という名前の.NET Standard Libraryプロジェクトに集めてあるので、SQLiteSampleプロジェクトだけに導入しています(次の画像)。
ただし、Entity Framework Coreの最新バージョンである3.xは、.NET Core 3用です。本稿執筆時点では、UWPは.NET Core 3には対応していないので、Entity Framework Coreは2.xを使います。このサンプルアプリでは、後述するUno.SQLitePCLRaw.provider.wasmのリリース時期に合わせて、Entity Framework Coreは2.13を使っています。
そして、WebASMのプロジェクトには、Uno.SQLitePCLRaw.provider.wasmとUno.sqlite-wasmも導入します(次の画像)。これらが、WebブラウザーのIndexedDBを利用してSQLiteのAPIを提供してくれます。ご覧の通り、これらはプレリリース版です。ステーブルリリースでは仕様変更があるかもしれません。
WebASMでの追加コード
WebASMプロジェクトでは、プログラム開始時にWebASM用のSQLiteプロバイダーをインスタンス化してセットしておきます。具体的には、次のコードのように太字にした行を追加します。
static void Main(string[] args)
{
SQLitePCL.raw.SetProvider(new SQLitePCL.SQLite3Provider_WebAssembly());
Windows.UI.Xaml.Application.Start(_ => _app = new App());
}
ここでSQLite3Provider_WebAssemblyクラスというのが、Uno.SQLitePCLRaw.provider.wasmパッケージで提供されている、WebASM用のSQLiteプロバイダーです。このコードの後は、普通にEntity Framework Coreを使ってSQLiteにアクセスするコードを書けます。
iOSでの追加コード
iOSでは、SQLiteデータベースに接続する前に次のコードのように初期化メソッドを呼び出しておく必要があります。
SQLitePCL.Batteries.Init();
ちなみに、こういったiOS/Androidに固有の話を調べるときは、Xamarin.Formsの情報が役に立ちます。前回で解説したように、Uno PlatformはXamarinを使ってiOS/Androidのアプリをビルドします。そのため、Xamarin.Formsの話はUno Platformでも通用することが多いのです。
接続文字列
接続文字列はプラットフォームによって異なります。次のコードを見てください。
// 接続文字列(UWPとWebASM)
const string DbName = "uf16.db";
private static string _connectionString = $"data source={DbName}";
// 接続文字列(Android)
string dbPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.Personal),
DbName);
_connectionString = $"filename={dbPath}";
// 接続文字列(iOS)
string dbPath = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
"..", "Library", DbName);
_connectionString = $"filename={dbPath}";
