演習: SQLite を使用してデータをローカルに格納する
この演習では、SQLite を使用して、アプリケーションと共にローカルに情報を格納します。 サンプル シナリオで、あなたは応答性を向上させるためにソーシャル メディア アプリのデータをキャッシュすることにしました。 この演習では、ユーザーに関する情報を格納するために、ローカルの SQLite データベースを作成して使用します。 物理データベース ファイルをローカル ストレージに保存します。
このモジュールでは、.NET 9.0 SDK を使います。 適切なコマンド ターミナルで次のコマンドを実行して、.NET 9.0 がインストールされていることを確認します。
dotnet --list-sdks
次の例のような出力が表示されます。
8.0.100 [C:\Program Files\dotnet\sdk]
9.0.100 [C:\Program Files\dotnet\sdk]
9
で始まるバージョンが一覧に表示されていることを確実にします。 何も表示されない場合、またはコマンドが見つからない場合は、最新の .NET 9.0 SDK をインストールしてください。
スターター ソリューションを開く
exercise repo をクローンまたはダウンロードします。
Note
ビルドによって生成されたファイルが最大パス長を超えないようにするため、演習コンテンツを C:\dev などの短いフォルダー パスに複製するのが最善です。
Visual Studio を使用して People.sln ソリューションを開きます。これは mslearn-dotnetmaui-store-local-data>People、または Visual Studio Code のスターター フォルダーで見つかります。
Note
まだアプリケーションを実行しないでください。コードは不完全であり、この演習の後半で不足している要素を追加するまで例外がスローされます。
SQLite エンティティを定義する
[Models] フォルダー内の Person.cs ファイルを開きます。
Person
クラスにId
という名前のint
プロパティを追加します。Name
という名前のstring
プロパティを追加します。 クラスは次のようになります。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 ファイル内で、
Person
クラスのファイルにSQLite
名前空間のusing
ディレクティブを追加します。 このディレクティブによって、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
マーカーを含む不完全なスケルトン コードが含まれています。PersonRepository.cs
クラスのファイルにSQLite
およびPeople.Models
名前空間のusing
ディレクティブを追加します。conn
という名前のプライベートSQLiteConnection
フィールドを、クラスの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 ファイルを開きます。
PersonRepo
という名前のpublic
、static
プロパティを追加します。 このプロパティは、App
クラスにPersonRepository
オブジェクトを保持します。PersonRepository
パラメーターをコンストラクターに追加し、'PersonRepo' プロパティをこのパラメーター内の値に設定することで、コンストラクター内でPersonRepo
プロパティを初期化します。 完成したApp
クラスは次のようになります。public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
Note
コンストラクターへの repo
パラメーターは、依存関係注入プロセスによって自動的に設定されます。
アプリケーションをテストする
Ctrl + Shift + B. キーを押して、ソリューションをビルドします。
ビルドが完了したら、F5 キーを押してデバッグを始めます。 UI が表示されたら、自分の名前を入力して [人物の追加] を選択します。
[すべての人物を取得] を選択して、自分の名前が表示されることを確認します。
さらに名前を追加し、保存されたユーザーのリストを取得してみます。
Visual Studio または Visual Studio Code に戻り、Shift+F5 キーを使用してデバッグを停止します。
アプリを再起動し、[すべての人物を取得] を選択します。 以前に保存した名前がまだデータベースに保存されていることを確認します。 完了したら、アプリを閉じます。