UWP アプリで SQLite データベースを使用する
SQLite を使用して、ユーザーのデバイス上の軽量データベースにデータを格納および取得できます。 このガイドでは、その方法について説明します。
ローカル ストレージに SQLite を使用する利点
✔️ SQLite は軽量で自己完結型です。 これは、他の依存関係のないコード ライブラリです。 構成する必要はありません。
✔️ データベース サーバーがありません。 クライアントとサーバーは同じプロセスで実行されます。
✔️ SQLite はパブリック ドメインに含まれているため、アプリで自由に使用して配布できます。
✔️ SQLite は、プラットフォームとアーキテクチャ全体で機能します。
SQLite の詳細については、を参照してください。
抽象化レイヤーを選択する
Microsoft によってビルドされた SQLite ライブラリ 、Entity Framework Core またはオープンソース 使用することをお勧めします。
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 パッケージをインストールします。
手記
Microsoft.Data.Sqlite' package and not 'Microsoft.Data.Sqlite.Core
をインストールしてください。 このパッケージは、依存関係として Microsoft.Data.Sqlite.Core
をインストールします。
サポートされているすべてのバージョンの Windows では SQLite がサポートされているため、アプリで SQLite ライブラリをパッケージ化する必要はありません。 代わりに、アプリで Windows にインストールされている SQLite のバージョンを使用できます。 これはいくつかの点で役立ちます。
✔️ SQLite バイナリをダウンロードし、アプリケーションの一部としてパッケージ化する必要がないため、アプリケーションのサイズを小さくします。
✔️ SQLite が SQLite のバグとセキュリティの脆弱性に対して重大な修正プログラムを発行した場合に、新しいバージョンのアプリをユーザーにプッシュする必要がないようにします。 WINDOWS バージョンの SQLite は、SQLite.org と連携して Microsoft によって管理されています。
✔️ ほとんどの場合、SDK バージョンの SQLite は既にメモリに読み込まれているため、アプリの読み込み時間が短縮される可能性があります。
まず、DataAccessという名前のクラス
ソリューションを右クリックし、[ソリューションの NuGet パッケージ
この時点で、選択肢があります。 Windows に含まれている SQLite のバージョンを使用することも、特定のバージョンの SQLite を使用する何らかの理由がある場合は、SQLite ライブラリをパッケージに含めることができます。 Windows に含まれている SQLite のバージョンを使用します。
[参照] タブを選択し、Microsoft.Data.SQLite.Core パッケージを検索して、最新の安定バージョンをインストールします。
SQLite Core パッケージ
SQLite データベースにデータを追加および取得する
次のことを行います。
1️⃣ データ アクセス クラスを準備します。
2️⃣ SQLite データベースを初期化します。
3️⃣ SQLite データベースにデータを挿入します。
4️⃣ SQLite データベースからデータを取得します。
5️⃣ 基本的なユーザー インターフェイスを追加します。
データ アクセス クラスを準備する
プロジェクトで DataAccess
クラスを開き、そのクラスを静的にします。
手記
この例では静的クラスにデータ アクセス コードを配置しますが、これは単なる設計上の選択肢であり、完全に省略可能です。
public static class DataAccess
{
}
このファイルの先頭に次の using ステートメントを追加します。
using Microsoft.Data.Sqlite;
using System.Collections.Generic;
SQLite データベースを初期化する
SQLite データベースを初期化する DataAccess
クラスにメソッドを追加します。
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 ファイルのコンストラクターで、DataAccess
クラスの InitializeDatabase
メソッドを呼び出します。
public App()
{
this.InitializeComponent();
this.Suspending += OnSuspending;
DataAccess.InitializeDatabase();
}
SQLite データベースにデータを挿入する
SQLite データベースにデータを挿入するメソッドを DataAccess
クラスに追加します。 このコードでは、クエリのパラメーターを使用して SQL インジェクション攻撃を防ぎます。
public static void AddData(string inputText)
{
string dbpath = Path.Combine(ApplicationData.Current.LocalFolder.Path, "sqliteSample.db");
using (SqliteConnection db =
new SqliteConnection($"Filename={dbpath}"))
{
SQLitePCL.Batteries.Init();
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 から始まる列序数を表す整数値を受け取ります。
この例では、序数パラメーターはそれほど重要ではありません。これは、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
次の手順
アプリを SQL Server データベースに直接接続する
「UWP アプリで SQL Server データベースを使用する」を参照してください。
異なるプラットフォーム間で異なるアプリ間でコードを共有する
「デスクトップと UWPの間でコードを共有する」を参照してください。
Azure SQL バックエンドでマスター詳細ページを追加する
顧客注文データベース サンプルを参照してください。