ストレージ オプションの比較
.NET Multi-Platform App UI (MAUI) には、データの性質、構造、サイズに応じて、データをデバイス上にローカルにキャッシュするための複数のストレージ オプションが用意されています。 .NET MAUI アプリにデータをローカルに格納するために最も一般的に使用される 3 つのオプションは次のとおりです。
- ユーザー設定: キーと値のペアのデータを格納します
- ファイル システム: ファイル システムにアクセスして、ルーズ ファイルをデバイスに直接格納します
- データベース: リレーショナル データベースでデータを格納します
このユニットでは、これらのストレージ オプションと、各オプションが最も適切である状況を見ていきます。
ユーザー設定を使用する場合
ユーザー設定は、ユーザーの選択など、単純なデータを操作する場合に便利です。 これらは多くの場合、ユーザーがアプリケーションを構成できるようにするために使用されます。 このデータは、キーと値のペアのセットとして格納します。 たとえば、ユーザーがセッション間でユーザー名とパスワードを保存するかどうかを指定できるようにしたとします。 ユーザーの選択内容を [ユーザー設定] に格納できます。
次のコードは、saveLoginDetails
変数に記録されたブール値を、SaveLogin
という名前のユーザー設定に格納し、後でこのデータを読み取る方法を示しています。 指定したユーザー設定が見つからない場合、Get
メソッドは既定値を指定するよう想定していることに注意してください。
bool saveLoginDetails = ...;
...
Preferences.Set("SaveLogin", saveLoginDetails);
...
var savedPreference = Preferences.Get("SaveLogin", false);
この Preferences
クラスには、名前付きのユーザー設定が存在するかどうかを判定するメソッド (ContainsKey
)、ユーザー設定を削除するメソッド (Remove
)、すべてのユーザー設定データを削除するメソッド (Clear
) も含まれています。
注意
基本設定として格納するのは、単純なデータ型のみとするべきです。 リスト、コレクション、配列などの大規模なオブジェクトへの参照を格納することはできません。 この型のデータには、ファイル システムまたはデータベースを使用します。
ファイル システムを使用する場合
モバイル デバイスとデスクトップ デバイスには、フォルダーとファイルの階層型ディレクトリ構造をもつファイル システムがあります。 ファイル システムの使用は、XML、バイナリ、またはテキスト ファイルなどのルースなファイルがあるときに便利です。 たとえば、デバイスでローカルにログ データを格納する必要があるとします。 テキスト ファイルを作成し、このファイルをファイル システムに保存して、イベントが発生したときにログをそこに書き込むことができます。 また、アプリのシャットダウン時に保存する必要がある場合は、大規模なデータ構造をファイルにシリアル化し、ファイル システムにローカルにキャッシュすることもできます。 アプリが再起動するときに、このデータを再度メモリに読み込むことができます。 次のコードは、データをファイルにシリアル化してこのファイルを保存し、その後データを読み取ってメモリに逆シリアル化する例を示しています。 ここでは、シリアル化形式の JSON を使用していますが、データの性質とアプリのセキュリティ要件に最も適した形式でデータを保存できます。
using System.Text.Json;
using System.IO;
// Data to be written to the file system, and read back later
List<Customer> customers = ...;
// Serialize and save
string fileName = ...;
var serializedData = JsonSerializer.Serialize(customers);
File.WriteAllText(fileName, serializedData);
...
// Read and deserialize
var rawData = File.ReadAllText(fileName);
customers = JsonSerializer.Deserialize<List<Customer>>(rawData);
アプリのサンドボックスにアクセスする
XML ファイルのようなルース ファイルを使うときは、ファイル システム内の適切な場所にそれを格納する必要があります。 このデータの一部には、機密性が高いため、他のアプリやユーザーが簡単にアクセスできる場所には保存したくないものがある場合があります。 .NET MAUI アプリは、アプリ サンドボックスを提供します。 アプリのサンドボックスは、アプリケーションで操作できるプライベート領域です。 既定では、オペレーティング システム以外、他のアプリケーションからこの領域にアクセスすることはできません。 サンドボックスには、FileSystem
クラスの AppDataDirectory
静的プロパティを使用してアクセスできます。
string path = FileSystem.AppDataDirectory;
このコードで、path
変数には、アプリケーションで使用するファイルを格納できる場所へのファイル パスが含まれます。 「ファイル システムを使用する場合」セクションで示されている手法を使って、このフォルダー内のファイルのデータの読み取りと書き込みを行うことができます。
Note
FileSystem.AppDataDirectory
プロパティは、デバイス固有のパスの抽象化であり、Android、iOS、WinUI3 で異なるフォルダーに評価されます。 この抽象化により、サンドボックスを参照するコードを、実行するプラットフォームに依存しない方法で記述できます。 コード内のデバイス固有のパスを明示的に参照するのではなく、この抽象化を使用します。
iOS アプリでデータを保存するためのガイドライン
Apple には、ファイルを格納する必要がある場所に関する iOS ガイドラインがあります。 2 つの主なフォルダーの場所があります。
"ライブラリ" フォルダー: 前に説明したように、
FileSystem.AppDataDirectory
プロパティはこのフォルダーを返します。 アプリで生成されたデータを格納するときは、ライブラリ フォルダーを使います。"ドキュメント" フォルダー: 次のコード スニペットは、
docFolder
変数でこのフォルダーを参照する方法を示しています。 ドキュメント フォルダーを使用して、ユーザーが生成したデータのみを格納します このデータは、ユーザー アクションへの直接応答で作成されます。 たとえば、Microsoft Word などのテキスト編集アプリケーションを作成する場合、ドキュメントをドキュメント フォルダーに格納します。string docFolder = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
データベースを使用する場合
データ間にリレーションシップがある場合や、時間の経過と共にデータをフィルター処理する場合には、ローカル データベースの使用をお勧めします。 たとえば、ソーシャル メディアのシナリオでは、各投稿に、タイムスタンプやコンテンツなど、投稿に関するデータが含まれます。 しかし、各投稿には、投稿を行ったユーザーとのリレーションシップも含まれます。 投稿間のデータの重複を防ぐため、また、データの検索効率を向上させるためにも、データベースでこのリレーションシップを表すことは合理的です。
SQLite データベースはファイルであり、適切な場所に格納する必要があります。 理想的には、サンドボックス内の AppDataDirectory
フォルダーの下にフォルダーを作成し、このフォルダーにデータベースを作成する必要があります。