システム内のユーザーファイルにアクセスするには、適切なアクセス許可が必要です。また、契約と拡張機能を使用してファイルを操作する必要があります(別の記事で説明します)。 ただし、各アプリケーションは、分離されたストレージにアクセスして、サービスデータと設定を保存します。 データの保存に必要なものはすべて、ApplicationDataオブジェクトのWindows.Storage名前空間にあります。
この記事では、次のオブジェクトの操作を検討します。
LocalSettingsおよびRoamingSettingsに単純なデータを保存します。 (単純なデータの保存)
LocalFolder、TemporaryFolder、RoamingFolderでのバイナリデータの保存。 (データをファイルシステムに保存する)
RoamingSettingsおよびRoamingFolder(クラウド内のデータストレージ。デバイス間のデータ同期)を使用する機能。
ローミングのデータのバージョン管理。
Uriを介した直接データアクセス。
次の部分では、データベースの操作について説明します。
ローカルデータを操作するための公式例は、 code.msdn.microsoft.com / windowsapps / ApplicationData-sample-fb043eb2からダウンロードできます。
この記事では、ローカルデータFileStorage.zipの使用例を検討します。
1. LocalSettingsおよびRoamingSettingsでの単純なデータの保存
LocalSettingsとRoamingSettingsの操作は同じです。 RoamingSettingsの特徴的な機能については、以下で説明します。
これらのオブジェクトは、主に単純なタイプの単純なデータを格納することを目的としています。 文字列、bool、int、floatなどのデータを保存できます。 これらのオブジェクトは、音量レベルなどの設定を保存するのに便利です。
APIは非常に簡単に実装されます。 次のコードは、「customKey」キーでテキストを保存します。
ApplicationData.Current.LocalSettings.Values["customKey"] = "mytext";
データの読み取りは保存と同じくらい簡単です(タイプオブジェクトの値は元のタイプに対して実行する必要があるため)。
var customText = (string) ApplicationData.Current.LocalSettings.Values["customKey"];
重要なデータ型(bool、int、floatなど)でNullReferenceExceptionエラーが発生しないように、キーを取得する前にキーの存在を確認することをお勧めします。
var settings = ApplicationData.Current.LocalSettings;
if(settings.Values.ContainsKey( "pageNumber"))
{
var number =(int)settings.Values ["pageNumber"];
}
多くの場合、より複雑なデータ型やバイナリデータを保存する必要があります。 この場合、xFolderオブジェクトを使用できます。
2. LocalFolder、TemporaryFolder、RoamingFolderでのバイナリデータの保存。
xFolderオブジェクトは、データをファイルシステムに格納するように設計されています。 それらを使った作業は、小さな機能でもほとんど同じです。
LocalFolderは、データベースなど、アプリケーションに必要なサービスファイル、またはクライアント上にある必要があるネットワークからダウンロードしたデータを格納するように設計されています。
TemproryFolderは、一時データに適しています。 たとえば、ソーシャルネットワークのクライアントであるアプリケーションの場合、このフォルダーは写真のキャッシュに適しています。
RoamingFolderは、RoamingSettingsと同様に、デバイス間で同期する必要があるデータや、クラウドに保存するデータに使用できます。 使用の詳細については後述しますが、小さなデータ(最大100 kb)を保存できます。
ファイルを操作するには、FileIOオブジェクトのメソッドを使用して、データの操作を簡素化することもできます。
たとえば、次のコードは、Hello!のコンテンツを含むテキストファイルmy.txtを作成します。 世界!
var storageFolder = ApplicationData.Current.LocalFolder; var file = await storageFolder.CreateFileAsync("my.txt", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(file, "Hello! World!");
同様に、テキストファイルを読み取ることができます。
var storageFolder = ApplicationData.Current.LocalFolder; var file = await storageFolder.GetFileAsync("my.txt"); var text = await FileIO.ReadTextAsync(file);
複雑なデータ型を保存する必要がある場合は、何らかのシリアライザーを使用できます。 たとえば、DataContractSerializer(System.Runtime.Serialization名前空間内)またはサードパーティのJson.netライブラリ。
記事に添付されている例には、Json.NETライブラリを使用して本を保存および読む例があります。
public static async Task Save(Book book) { var serializedString = JsonConvert.SerializeObject(book); var storageFolder = ApplicationData.Current.LocalFolder; var file = await storageFolder.CreateFileAsync("book.dat", CreationCollisionOption.ReplaceExisting); await FileIO.WriteTextAsync(file, serializedString); } public static async Task<Book> GetBook() { var file = await ApplicationData.Current.LocalFolder.GetFileAsync("book.dat"); var serializedString = await FileIO.ReadTextAsync(file); return await JsonConvert.DeserializeObjectAsync<Book>(serializedString); }
設定とフォルダの操作を検討したので、ローミングデータを操作するときの機能を検討できます。
3. RoamingSettingsおよびRoamingFolderを使用する機能
RoamingSettingsとRoamingFolderは、小さなデータをクラウドに保存するように設計されています。 アプリケーションの完全なデータベースを保存しようとしてはなりません。 たとえば、書籍を読むためのアプリケーションがある場合は、書籍のテキストを保存するのではなく、最後に開いたファイルとユーザーが現在読んでいるページを保存することができます。 ゲームの場合、ゲームの現在の状態(ロック解除されたレベルに関する情報など)を保存できます。
これらのオブジェクトは、独自のサーバーインフラストラクチャを維持することなく、アプリケーションの再インストール間だけでなく、異なるデバイス間でもゲームの通過を節約する自由な機会を提供します!
さらに、前述のように、これらのオブジェクトに保存されるデータはアプリケーションのインストール間で保存されるため、これらのリポジトリのデータを操作するロジックを慎重に設計する必要があります。再インストール後も落ち続けます。 これは、ユーザーがアプリケーションを操作するすべての能力を失うという事実につながる可能性があります。
3.1。 制限事項
使用可能なデータの量は制限されており、その値はRoamingStorageQuotaプロパティから取得できます(値はキロバイトで指定されます-デフォルトは100 kbです)
ApplicationData.Current.RoamingStorageQuota
また、データをRoamingFolderに保存する場合、ファイル名にスペースを使用することはできません。
3.2。 同期時間
ローミングフォルダを介して動作するアプリケーションを設計する場合、デバイス間のデータ同期時間は約10〜15分であることに留意する必要があります。 ただし、RoamingSettingsには、同期の優先度が高いデータに使用する必要があるサービスキーがあります。
HighPriority
このキーのデータ同期時間は約15〜30秒です。
ApplicationData.Current.LocalSettings.Values["HighPriority"] = "high priority data";
実行時に、DataChanged:データ変更イベントをキャッチすることもできます。
ApplicationData.Current.DataChanged += Current_DataChanged;
イベントはUIスレッドで発生しないため、UIの更新はディスパッチャを介して行う必要があります。
void Current_DataChanged(ApplicationData sender, object args) { Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () => { MyTextBox.Text = (string)ApplicationData.Current.RoamingSettings.Values["HighPriority"]; }); }
アプリケーションをデバッグするには、ApplicationData.Current.SignalDataChanged()メソッドを呼び出します。 DataChangedイベントをトリガーします。
アプリケーションの新しいバージョンで、前のアプリケーションのデータ構造と互換性のない新しいデータ構造が必要な場合はどうしますか?
4.ローミングでのデータのバージョン管理。
時間とともに進化し続けるアプリケーションには、新しいデータ構造が必要です。 ローカルに保存されているデータについては、バージョン管理とデータ更新のための独自のメカニズムを提供できます。
ローミングのデータの場合、潜在的な問題は、新しいアプリケーションで古い形式のデータを処理するロジックを提供できる場合、既にインストールされ動作しているアプリケーションは新しい形式のデータを処理できないことです。
WinRTは、データを異なるバージョンに分割するための既製のAPIを提供します。 アプリケーションへのローミングデータは、同じ番号のバージョンからのみデータを受信します。 DataChangedイベントは、同じバージョンのデータがインストールされているアプリケーションでのみ発生します。
現在のバージョンは、ApplicationData.Versionプロパティから取得できます。
ApplicationData.Current.Version
デフォルトでは、バージョン番号は0です。
最初に将来の変更を予測し、デフォルトバージョンではなくバージョン1から開始することを強くお勧めします。
SetVersionAsyncメソッドを使用して、新しいバージョンのデータをインストールできます。
await ApplicationData.Current.SetVersionAsync(versinoNumber, UpgradeToVersionHandler); TextBlockDataVersion.Text = ApplicationData.Current.Version.ToString();
ここで:
versionNumber-整数バージョン番号値
UpgradeToVersionHandler-データ更新ハンドラー:
private void UpgradeToVersionHandler(SetVersionRequest setversionrequest) { var defferal = setversionrequest.GetDeferral(); if (setversionrequest.DesiredVersion > setversionrequest.CurrentVersion) { //UpgradeCodeFromOldToNewVersion(); } defferal.Complete(); }
アプリケーションの新しいバージョンをインストールするときはデータも更新する必要があるため、データの更新時にアプリケーションが閉じないようにGetDefferral()メソッドを使用する必要があります。
ローミングのデータと同様に、データバージョンはアプリケーションを再インストールした後でも残ります。 バージョン番号はデバイス間で同期しません(各デバイスには独自のバージョン番号があります)。
多くの場合、アプリケーションでは、フォルダー内のデータに直接アクセスする必要があります。 次のセクションでは、これを行う方法を検討します。
5. UriおよびPathを介したデータへの直接アクセス。
WinRTは、データに直接アクセスするためのプレフィックスを導入しました。 これには、次のプレフィックスを使用できます。
ms-appx:///-プロジェクトに含まれるファイルへのアクセス。
ms-appdata:/// local /-LocalFolderフォルダーに保存されているファイルへのアクセス
ms-appdata:/// roaming /-RoamingFolderフォルダーに保存されているファイルへのアクセス
ms-appdata:/// temp /-TemporaryFolderフォルダー内のファイルにアクセスします
公式の例では、これらのプレフィックスを使用して写真にアクセスする例があります。
LocalImage.Source = new BitmapImage(new Uri("ms-appdata:///local/appDataLocal.png")); RoamingImage.Source = new BitmapImage(new Uri("ms-appdata:///roaming/appDataRoaming.png")); TempImage.Source = new BitmapImage(new Uri("ms-appdata:///temp/appDataTemp.png"));
必要に応じて、アプリケーションが保存されているフォルダーにアクセスすることもできます。 フォルダーへのパスは、すべてのxFolderオブジェクトのPathプロパティから取得できます。 たとえば、ローカルフォルダーへのパスは、プロパティから取得できます。
ApplicationData.Current.LocalFolder.Path
フォルダーへのパスは次のようになります。
c:\ users \ UserName \ AppData \ Local \ Packages \ e965c8d4-0dff-4f2e-8340-24041aabca05_5mvwcwnjebzdj \ LocalState \
どこで
UserName-システムのユーザー名
e965c8d4-0dff-4f2e-8340-24041aabca05-アプリケーション識別子。
したがって、このフォルダー内のファイルへのフルパスは、単純な行の接続として、または補助メソッドPath.Combine(Namespace System.IO)を使用して取得できます。 したがって、my.txtファイルへのパスは次のようになります。
var fullPath=Path.Combine(ApplicationData.Current.RoamingFolder.Path, "my.txt");
ファイルへの直接アクセスは、データベースの操作に便利に使用でき、データベースのあるファイルへのパスを示します。この作業については次のパートで説明します。
まとめ
ご覧のとおり、Microsoftはローカルおよび一時データを保存するための既製のツールを提供し、デバイス間でアプリケーションの状態を同期するためのシンプルで無料のメカニズムを提供することにより、データを操作する機能を大幅に簡素化しました(必要に応じて小さなデータのクラウドバックアップとして使用できます)。 これで、お気に入りのゲームのパッセージを無料で保存する機会をユーザーに提供できます。 :)