UWP アプリでの SQLite データベースの使用
SQLite を使用すると、ユーザーのデバイス上の軽量なデータベースにデータを保存し、取得することができます。 このガイドでその方法を示します。
ローカル ストレージに SQLite を使用するメリット
✔️ SQLite は軽量で自己完結型です。 その他の依存関係がないコード ライブラリです。 構成する必要がありません。
✔️ データベース サーバーはありません。 クライアントとサーバーは、同じプロセスで実行されます。
✔️ SQLite はパブリック ドメインにあるため、アプリで自由に使用して配布できます。
✔️ SQLite はプラットフォームやアーキテクチャにかかわらず動作します。
SQLite について詳しくは、こちらをご覧ください。
アブストラクション レイヤーを選択する
Entity Framework Core またはオープン ソースの SQLite ライブラリ (Microsoft が構築) を使用することをお勧めします。
Entity Framework Core
Entity Framework (EF) は、ドメイン固有のオブジェクトを使ってリレーショナル データを操作できる、オブジェクト リレーショナル マッパーです。 既に他の .NET アプリでデータを操作するためにこのフレームワークを使用している場合は、そのコードを UWP アプリに移行することができ、接続文字列を適切に変更することでアプリが動作します。
試してみるには、「EF Core の概要」を参照してください。
SQLite ライブラリ
Microsoft.Data.Sqlite ライブラリでは、System.Data.Common 名前空間内にインターフェイスを実装しています。 Microsoft では、これらの実装をアクティブに保守しています。これらの実装によって、低レベルのネイティブ SQLite API に関する直感的なラッパーを提供します。
このガイドの残りの部分では、このライブラリの使用について説明します。
Microsoft.Data.SQlite ライブラリを使用するようにソリューションをセットアップする
基本的な UWP プロジェクトから始めて、適切な Nuget パッケージをインストールします。
サポートされているすべてのバージョンの Windows では SQLite がサポートされているため、アプリで SQLite ライブラリをパッケージ化する必要はありません。 代わりに、アプリでは Windows と共にインストールされるバージョンの SQLite を使用することができます。 これにより、次のような利点が得られます。
✔️ SQLite バイナリをダウンロードして、アプリケーションの一部としてパッケージ化する必要がないため、アプリケーションのサイズが小さくなります。
✔️ SQLite のバグやセキュリティの脆弱性に対する重要な修正プログラムが公開された場合でも、アプリの新しいバージョンをユーザーに勧める必要がありません。 Windows 版の SQLite は、Microsoft が SQLite.org と連携して保守します。
✔️ SQLite の SDK バージョンが既にメモリに読み込まれている可能性が高いため、アプリの読み込み時間が高速になる可能性があります。
まず、DataAccess という名前の UWP プロジェクトにクラスを追加します。 .NET Standard クラス ライブラリ プロジェクトを使用してデータ アクセス コードを含めることができますが、この例では使用しません。
ソリューションを右クリックし、 [ソリューションの NuGet パッケージの管理] をクリックします。
この時点で 2 つの選択肢があります。 Windows に含まれている SQLite のバージョンを使用することができます。または、何らかの理由で特定バージョンの SQLite を使用する場合は、パッケージに SQLite ライブラリを含めることができます。 Windows に含まれている SQLite のバージョンを使用します。
[参照] タブを選択し、Microsoft.Data.SQLite.core パッケージを検索して、最新の安定バージョンをインストールします。
SQLite データベースのデータの追加と取得
以下の作業を行います。
1️⃣ データ アクセス クラスを準備します。
2️⃣ SQLite データベースを初期化します。
3️⃣ SQLite データベースにデータを挿入します。
4️⃣ SQLite データベースからデータを取得します。
5️⃣ 基本的なユーザー インターフェイスを追加します。
データ アクセス クラスを準備する
プロジェクトで DataAccess
クラスを開き、そのクラスを静的に設定します。
注意
この例ではデータ アクセス コードを静的クラスに配置していますが、これは設計の選択肢の 1 つで、完全に任意な方法です。
public static class DataAccess
{
}
このファイルの先頭に、次の using ステートメントを追加します。
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
SQLite データベースを初期化する
DataAccess
クラスに、SQLite データベースを初期化するメソッドを追加します。
public async static void InitializeDatabase()
{
await ApplicationData.Current.LocalFolder.CreateFileAsync("sqliteSample.db", CreationCollisionOption.OpenIfExists);
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
String tableCommand = "CREATE TABLE IF NOT " +
"EXISTS MyTable (Primary_Key INTEGER PRIMARY KEY, " +
"Text_Entry NVARCHAR(2048) NULL)";
SqliteCommand createTable = new SqliteCommand(tableCommand, db);
createTable.ExecuteReader();
}
}
このコードは、SQLite データベースを作成し、アプリケーションのローカル データ ストアに保存します。
この例では、データベースに sqlliteSample.db
という名前を付けますが、インスタンス化するすべての SqliteConnection オブジェクトでその名前を使用する限り、任意の名前を使用することができます。
UWP プロジェクトの App.xaml.cs ファイルのコンストラクターで、InitializeDatabase
クラスの DataAccess
メソッドを呼び出します。
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
DataAccess.InitializeDatabase();
}
SQLite データベースにデータを挿入する
DataAccess
クラスに、SQLite データベースにデータを挿入するメソッドを追加します。 このコードでは、クエリでパラメーターを使用して SQL インジェクション攻撃を防ぎます。
public static void AddData(string inputText)
{
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
SqliteCommand insertCommand = new SqliteCommand();
insertCommand.Connection = db;
// Use parameterized query to prevent SQL injection attacks
insertCommand.CommandText = "INSERT INTO MyTable VALUES (NULL, @Entry);";
insertCommand.Parameters.AddWithValue("@Entry", inputText);
insertCommand.ExecuteReader();
}
}
SQLite データベースからデータを取得する
SQLite データベースからデータの行を取得するメソッドを追加します。
public static List<String> GetData()
{
List<String> entries = new List<string>();
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
db.Open();
SqliteCommand selectCommand = new SqliteCommand
("SELECT Text_Entry from MyTable", db);
SqliteDataReader query = selectCommand.ExecuteReader();
while (query.Read())
{
entries.Add(query.GetString(0));
}
}
return entries;
}
Read メソッドは、返されるデータの行を次に進めます。 このメソッドでは、残りの行がある場合は true
を返し、ない場合は false
を返します。
GetString メソッドは、指定された列の値を文字列として返します。 このメソッドでは、必要なデータの 0 から始まる列の序数を表す整数値を受け取ります。 GetDataTime や GetBoolean などの同様のメソッドを使用できます。 列に格納するデータの型に基づいてメソッドを選択します。
この例では 1 つの列のすべてのエントリを選択しているため、序数パラメーターがそれほど重要ではありません。 ただし、クエリに複数の列が含まれる場合は、序数値を使用してデータを取り出す列を取得します。
基本的なユーザー インターフェイスを追加する
UWP プロジェクトの MainPage.xaml ファイルに、次の XAML を追加します。
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<TextBox Name="Input_Box"></TextBox>
<Button Click="AddData">Add</Button>
<ListView Name="Output">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackPanel>
</Grid>
この基本的なユーザー インターフェイスでは、SQLite データベースに追加する文字列を入力するための TextBox
をユーザーに提供します。 この UI の Button
を、SQLite データベースからデータを取得して、ListView
にそのデータを表示するイベント ハンドラーに接続します。
MainPage.xaml.cs ファイルで、次のハンドラーを追加します。 これは、UI で Button
の Click
イベントに関連付けたメソッドです。
private void AddData(object sender, RoutedEventArgs e)
{
DataAccess.AddData(Input_Box.Text);
Output.ItemsSource = DataAccess.GetData();
}
アプリケーションの起動時に既存のデータが読み込まれることを確認する必要もあります。 MainPage
コンストラクターに、GetData()
を呼び出すコード行を追加します。
public MainPage()
{
this.InitializeComponent();
Output.ItemsSource = DataAccess.GetData();
}
これで終了です。 Microsoft.Data.Sqlite を参照して、他に SQLite データベースと連携できるものを確認してください。 UWP アプリでデータを使用するその他の方法については、次のリンクを参照してください。
次のステップ
アプリを SQL Server データベースに直接接続する
「UWP アプリでの SQL Server データベースの使用」をご覧ください。
異なるプラットフォームにわたる異なるアプリの間でコードを共有する
デスクトップと UWP 間のコード共有に関するページをご覧ください。
Azure SQL バックエンドでマスター/詳細ページを追加する
顧客注文データベースのサンプルをご覧ください。