演習: SQLite を使用してデータをローカルに格納する
この演習では、SQLite を使用して、アプリケーションと共にローカルに情報を格納します。 サンプル シナリオで、あなたは応答性を向上させるためにソーシャル メディア アプリのデータをキャッシュすることにしました。 この演習では、ユーザーに関する情報を格納するために、ローカルの SQLite データベースを作成して使用します。 物理データベース ファイルをローカル ストレージに保存します。
このモジュールでは、.NET 10.0 SDK を使用します。 任意のコマンド ターミナルで次のコマンドを実行して、.NET 10.0 がインストールされていることを確認します。
dotnet --list-sdks
次の例のような出力が表示されます。
9.0.100 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]
10 で始まるバージョンが一覧に表示されていることを確実にします。 何も表示されていない場合、またはコマンドが見つからない場合は、 最新の .NET 10.0 SDK をインストールします。
スターター ソリューションを開く
exercise repo をクローンまたはダウンロードします。
注
ビルドによって生成されたファイルが最大パス長を超えないようにするため、演習コンテンツを C:\dev などの短いフォルダー パスに複製するのが最善です。
Visual Studio を使用して People.sln ソリューションを開きます。これは mslearn-dotnetmaui-store-local-data>People、または Visual Studio Code のスターター フォルダーで見つかります。
注
まだアプリケーションを実行しないでください。コードは不完全であり、この演習の後半で不足している要素を追加するまで例外がスローされます。
SQLite エンティティを定義する
[Models] フォルダー内の Person.cs ファイルを開きます。
intクラスにIdという名前のPersonプロパティを追加します。stringという名前のNameプロパティを追加します。 クラスは次のようになります。namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }Person.cs ファイルを保存します。
SQLite ライブラリを追加する
Visual Studio のソリューション エクスプローラーから People プロジェクト ノードを右クリックします。
表示されたコンテキスト メニューで、[NuGet パッケージの管理] を選択します。
sqlite-net-pcl を検索して選択した後、[インストール] を選択します。
Visual Studio Code を使用している場合は、以下のコマンドでターミナルとこれらのパッケージを開きます。
dotnet add package sqlite-net-pcl
SQLite 属性を追加する
Person.cs ファイル内で、
usingクラスのファイルにSQLite名前空間のPersonディレクティブを追加します。 このディレクティブによって、SQLite の属性を使用できるようになります。using SQLite; namespace People.Models; public class Person { ... }Personクラスに[Table]属性のアノテーションを付け、テーブル名をpeopleと指定します。主キーとして
Idプロパティを指定します。 これに[PrimaryKey]および[AutoIncrement]属性のアノテーションを付けます。Nameプロパティにアノテーションを追加します。MaxLengthを 250 と指定します。 列の各値がUniqueになるように指定します。完成したクラスは次のようになります。
using SQLite; namespace People.Models; [Table("people")] public class Person { [PrimaryKey, AutoIncrement] public int Id { get; set; } [MaxLength(250), Unique] public string Name { get; set; } }Person.cs ファイルを保存します。
データベースに接続する
PersonRepository.cs ファイルを開きます。
PersonRepositoryクラスを調べます。 このクラスには、データベースにアクセスするための機能を追加するTODOマーカーを含む不完全なスケルトン コードが含まれています。usingクラスのファイルにSQLiteおよびPeople.Models名前空間のPersonRepository.csディレクティブを追加します。SQLiteConnectionという名前のプライベートconnフィールドを、クラスのInit関数の上に追加します。Init関数で、connがnullと等しくないかを確認します。 その場合は、すぐに戻ります。if (conn != null) return;これにより、SQLite データベースの初期化コードは 1 回しか実行されなくなります。
connフィールドを初期化し、_dbPath変数を使用してデータベースに接続します。conn.CreateTableメソッドを使用して、Personデータを格納するテーブルを作成します。 完成したInit関数は次のようになります。using SQLite; using People.Models; ... private SQLiteConnection conn; ... private void Init() { if (conn != null) return; conn = new SQLiteConnection(_dbPath); conn.CreateTable<Person>(); }
データベースに行を挿入する
PersonRepositoryクラスで、AddNewPersonメソッドを見つけます。新しい
Personオブジェクトを挿入するには、このメソッドのTODOコメントをコードに置き換えます。 このコードは、最初にInitを呼び出してデータベースが初期化されていることを確認した後、SQLiteConnectionオブジェクトのInsertメソッドを使用します。 次のコードで示すように、result変数をInsertメソッドが返す値に設定します。public void AddNewPerson(string name) { int result = 0; try { // enter this line Init(); // basic validation to ensure a name was entered if (string.IsNullOrEmpty(name)) throw new Exception("Valid name required"); // enter this line result = conn.Insert(new Person { Name = name }); ... } ... }
データベースから行を取得する
PersonRepositoryクラスで、GetAllPeopleメソッドを見つけます。Initを呼び出して、データベースが初期化されていることを確認します。ジェネリック
Table\<T>メソッドを使用して、テーブル内のすべての行を取得します。 型パラメーターとしてPersonを指定します。ToList()拡張メソッドを使用して結果をList\<Person>コレクションに変換し、このコレクションを返します。try-catchブロックにコードをラップして、エラー処理を追加します。 エラーがある場合は、StatusMessageプロパティを例外のMessageプロパティに設定して、空のコレクションを返します。 完成したメソッドは次のようになります。public List<Person> GetAllPeople() { try { Init(); return conn.Table<Person>().ToList(); } catch (Exception ex) { StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message); } return new List<Person>(); }PersonRepository.cs ファイルを保存します。
リポジトリを UI に統合する
MauiProgram.cs ファイルを開きます。
CreateMauiApp関数で、MainPageページをシングルトン サービスとしてアプリに追加するステートメントの後に、以下のタスクを実行するコードを追加します。dbPathという名前の文字列変数を作成します。 式FileAccessHelper.GetLocalFilePath("people.db3")を使用してこの文字列を初期化します。 アプリで使用されるデータベース ファイルは people.db3 になり、このファイルはアプリによってデバイスのローカル ストレージに保存されます。依存関係の挿入を使用して、
PersonRepositoryクラスをシングルトン サービスとしてアプリに追加します。PersonRepositoryクラスは、データベース ファイルへのパスを文字列パラメーターとして受け取るコンストラクターを公開します。
CreateMauiApp関数の完成したコードは、次のようになります。public static MauiApp CreateMauiApp() { var builder = MauiApp.CreateBuilder(); builder .UseMauiApp<App>() .ConfigureFonts(fonts => { fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular"); fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold"); }); // Add this code string dbPath = FileAccessHelper.GetLocalFilePath("people.db3"); builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath)); return builder.Build(); }MauiProgram.cs ファイルを保存します。
ソリューション エクスプローラーで App.xaml を展開してから、App.xaml.cs ファイルを開きます。
publicという名前のstatic、PersonRepoプロパティを追加します。 このプロパティは、PersonRepositoryクラスにAppオブジェクトを保持します。PersonRepoパラメーターをコンストラクターに追加し、'PersonRepo' プロパティをこのパラメーター内の値に設定することで、コンストラクター内でPersonRepositoryプロパティを初期化します。 完成したAppクラスは次のようになります。public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
注
コンストラクターへの repo パラメーターは、依存関係注入プロセスによって自動的に設定されます。
アプリケーションをテストする
Ctrl + Shift + B. キーを押して、ソリューションをビルドします。
ビルドが完了したら、F5 キーを押してデバッグを始めます。 UI が表示されたら、自分の名前を入力して [人物の追加] を選択します。
[すべての人物を取得] を選択して、自分の名前が表示されることを確認します。
さらに名前を追加し、保存されたユーザーのリストを取得してみます。
Visual Studio または Visual Studio Code に戻り、Shift+F5 キーを使用してデバッグを停止します。
アプリを再起動し、[すべての人物を取得] を選択します。 以前に保存した名前がまだデータベースに保存されていることを確認します。 完了したら、アプリを閉じます。