UniversalWindowsApp開発入門04-データ保存と復元-

動画

UWPにおけるデータ保存

Universal Windows Appなどのアプリケーションでは、アプリケーションの持っている情報などは基本的にメモリの上に置かれるため、アプリが終了するとデータが消えてしまいます。

そのため、アプリが終了する前にデータをストレージに保存し、アプリが開始するときに適切に復元をしなければいけません。

Universal Windows Appではそのようなデータの保存、復元を行うAPIが存在しています。

UWPのアプリの状態

アプリが終了するときにデータの保存、再開するときにデータの復元を行わなければならいのですが、UWPではそのようなアプリの終了、再開のタイミングをイベントとして通知してくれる機能があります。

UWPでは基本的に以下の3つの状態を持ちます。

28

そして、ユーザーによって閉じるボタンなどが押され、アプリが終了するとき、Suspendingイベントが発生し、アプリがユーザーによって起動(再開)されたとき、Resumingイベントが発生します。

public App()
{
    this.InitializeComponent();
    this.Suspending += OnSuspending;
    this.Resuming += OnResuming;
}

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //ここでアプリのデータを保存

    deferral.Complete();
}

private void OnResuming(object sender, object e)
{
    //ここでアプリのデータを復元
}

つまり、OnSuspendingイベントでデータを保存し、OnResumingイベントでデータを復元すればアプリは終了してもデータを保持し続けることができます。

 

LocalSetting

UWPにおいて、簡易的なデータを保存するときはApplicationDataContainerに保存することができます。

ApplicationDataContainerはディクショナリ構造になっており、キーを指定してデータを保存することができます。

private void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();

    //ここでアプリのデータを保存
    ApplicationDataContainer setting = ApplicationData.Current.LocalSettings;
    setting.Values["setting1"] = "hoge";

    deferral.Complete();
}

データを復元するときは再度ApplicationDataContainerにアクセスし、キーが存在するか確認したあと、キーを指定してデータを復元します。

private void OnResuming(object sender, object e)
{
    //ここでアプリのデータを復元
    ApplicationDataContainer setting = ApplicationData.Current.LocalSettings;
    if (setting.Values.ContainsKey("setting1"))
    {
        string setting1 = setting.Values["setting1"].ToString();
        Debug.WriteLine(setting1);
    }
}

 

LocalFolder

大きなデータを保存する場合はStorageFolderを取得してデータをファイルとして書き込みます。

UWPで簡易的なデータの書き込みを行う場合、FileIOというクラスを使うのが便利です。

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //ここでアプリのデータを保存
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    StorageFile file = await localFolder.CreateFileAsync("samplefile",CreationCollisionOption.ReplaceExisting);
    await FileIO.WriteTextAsync(file, "Hello!");
    deferral.Complete();
    
}

データ復元時にはファイルが存在するかを確認し、存在する場合は読み込み、データを復元します。

private async void OnResuming(object sender, object e)
{
    //ここでアプリのデータを復元
    StorageFolder localFolder = ApplicationData.Current.LocalFolder;
    IReadOnlyList<StorageFile> list = await localFolder.GetFilesAsync();
    if (list.Any(q=>q.Name=="samplefile"))
    {
        StorageFile file = list.Single(q => q.Name == "samplefile");
        string setting1 = await FileIO.ReadTextAsync(file);
        Debug.WriteLine(setting1);
    }
}

LocalFolderとRoamingFolder

今回使用したLocalFolderはデータをローカルストレージに保存します。

よって、別のデバイスで実行した場合はデータを継続して使うことができません。

そのような別デバイスでもデータを継続して使用するためにUWPではRoamingFolderというものが存在し、RoamingFolderに保存したデータはOneDriveによって別デバイス間でも同期されます。

defferal

Suspendingイベントにおいて、以下のような記述がありますがsuspendingイベントではこの記述の中でデータを保存しなければいけません。

なぜなら、Suspendingイベントにおいて非同期メソッドを用いた場合、非同期メソッドが完了する前にアプリが一時停止に入ってしまって、データが保存できないからです。

なのでsuspendingでは必ず、e.SuspendingOperation.GetDefferal()とdeferral.Complete()の間にデータ保存処理を記述する必要があります。

private async void OnSuspending(object sender, SuspendingEventArgs e)
{
    var deferral = e.SuspendingOperation.GetDeferral();
    //ここでアプリのデータを保存
    

    deferral.Complete();
    
}

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください