前の部分で述べたように、通常、電話では長期保存用に分離ストレージが使用されます。
このパートでは、次のことを学習します。
- 分離ストレージにデータを保存する方法。
 - 分離ストレージからデータをロードする方法。
 - 分離ストレージからデータを削除する方法。
 
分離ストレージの使用
サンドボックスストレージは、デスクトップコンピューター上のファイルシステムに類似しています。 ただし、各アプリケーションは分離ストレージの一部のみにアクセスでき、他のアプリケーションが使用するデータにはアクセスできません。
ヒント:
Webサービスを使用して外部からデータを保存および受信する場合でも、ネットワークが利用できない場合、将来の使用のために携帯電話にデータをキャッシュする必要があります。その場合、この目的で分離ストレージを使用する必要があります。
分離ストレージはメモリ内のディクショナリよりも遅いため、長期ストレージを必要とする可能性のあるデータと、状態ディクショナリでサポートされていないシリアライズ不可能なオブジェクトにのみ使用する必要があります。 ほとんどのクラスはデフォルトでシリアル化可能ですが、一部のクラスはそうではないため、以下で説明するように特別な処理が必要です。 たとえば、JPGなどのバイナリイメージファイルであるImageSourceオブジェクトはシリアル化できません。
遅延の影響を最小限に抑えるために、分離ストレージを操作するためのコードの場所を慎重に検討する必要があります。 たとえば、アプリケーションに保存するデータが大量にある場合、アプリケーションを終了すると同時に保存するのを避け、徐々に保存する必要があります。 一般に、データが利用可能になり次第、またはできるだけ早く、分離ストレージにデータを保存する必要があります。
ヒント:
Silverlightのデスクトップバージョンとは異なり、電話には、アプリケーションが使用できる分離ストレージの容量に制限はありません。 ただし、デスクトップコンピュータに比べて電話の合計ストレージスペースは大幅に少ないため、使用するスペースはできるだけ少なくする必要があります。
分離ストレージは、2つの形式のアクセスを提供します。
- キー/値のペアを格納するために使用できる状態ディクショナリ。値はプリミティブ型の値またはシリアル化可能なオブジェクトの値にすることができます。
 - アプリケーションファイルの保存、ロード、削除に使用できる仮想ファイルシステムインターフェイス。
 
ファイルの保存と読み込みに分離ストレージを使用するには、IsolatedStorageFileクラスを使用します。これは、ファイルシステムの仮想インターフェイスです。 GetUserStoreForApplicationメソッドを呼び出すことにより、リポジトリにアクセスできます。 リポジトリにアクセスすると、メソッドを呼び出してファイルやフォルダーを開いたり、作成したり、削除したりできます。
分離ストレージにデータを保存する
辞書を使用してシリアライズ可能なオブジェクトを分離ストレージに保存するには、IsolatedStorageSettings.ApplicationSettingsオブジェクトを割り当ててキーを指定するだけです。 次に、IsolatedStorageSettings.Saveメソッドを呼び出します。 アプリケーションを終了すると、アプリケーションは保存されているすべての値を自動的に保存するため、Save呼び出しは必要ありません。
次のコードスニペットは、辞書にCarオブジェクトを(シリアル化できないPictureプロパティを考慮せずに)保存する方法を示しています。 CarDataStore.SaveCarメソッドは、 CAR_KEY定数を使用してCarプロパティの値をIsolatedStorageSettings.ApplicationSettings辞書に直接割り当てます。 次の行でIsolatedStorageSettings.Saveメソッドが呼び出されると、値は分離ストレージに書き込まれます。
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
private const string CAR_PHOTO_FILE_NAME = "CarPhoto.jpg" ; private const string CAR_KEY = "FuelTracker.Car" ; private static readonly IsolatedStorageSettings appSettings = IsolatedStorageSettings.ApplicationSettings; public static void SaveCar(Action errorCallback) { try { appSettings[CAR_KEY] = Car; appSettings.Save(); SaveCarPhoto(CAR_PHOTO_FILE_NAME, Car.Picture, errorCallback); DeleteTempCarPhoto(); } catch (IsolatedStorageException) { errorCallback(); } } * This source code was highlighted with Source Code Highlighter .
分離ストレージに使用可能なスペースがない可能性があります。 この場合、Saveメソッドを呼び出すと例外がスローされます。 この例外を処理することは重要ですが、データアクセス層でこれを行うことは意味がありません。 代わりに、通常はユーザーに警告が表示されます。 このため、 SaveCarメソッドは、例外が発生したときに呼び出されるActionデリゲートを受け入れます。 これにより、独自のTry / Catchブロックや特定の種類の例外に依存することなく、呼び出し元のコードが独自の方法でエラーを処理できます。 この方法については、「入力データの検証」で詳しく説明します。
認定要件:
アプリケーションはすべての例外を処理し、予期せずに終了することはありません。
Car.Pictureプロパティは車の画像であり、BitmapImage型のオブジェクトです。 BitmapImage型はシリアル化できないため、 Car.PictureプロパティをIsolatedStorageSettings.ApplicationSettings辞書に保存することはできません。そのため、画像は個別に考慮されます。 ただし、 Pictureプロパティをシリアル化から明示的に除外する必要があります。そうしないと、Saveメソッドを呼び出すと常に例外がスローされます。 シリアル化からプロパティを除外するには、Car.csの次の例に示すように、IgnoreDataMemberAttributeを適用する必要があります。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- [System.Runtime.Serialization.IgnoreDataMemberAttribute]
 - パブリック BitmapImage画像
 - {
 - get { return _picture; }
 - セット
 - {
 - _picture = value ;
 - NotifyPropertyChanged( "Picture" );
 - }
 - }
 
ファイルを分離ストレージに保存するには、IsolatedStorageFile.CreateFileまたはIsolatedStorageFile.OpenFileメソッドを使用します。 IsolatedStorageFileには、ファイルが存在するかどうかを確認し、ディレクトリを作成するためのメソッドもあります。
Car.Pictureプロパティはシリアル化できないため、分離ストレージにファイルとして保存されます。 メディアライブラリのリンクを介して選択した写真にアクセスできれば、隔離されたストレージに個別に保存する必要はありません。 しかし、これを書いている時点ではこれは不可能でした。 追加情報は、「Windows Phoneでの写真へのアクセス」セクションで提供されます。
次のコードはSaveCarPhotoメソッドを示しています。 このメソッドは車の画像を分離ストレージのディレクトリにファイルとして保存します。 OpenFileメソッドは、新しいファイルを作成するために使用されます。 Extensions.SaveJpegメソッドの使用に注意してください。 このヘルパーメソッドは、BitmapImageからStreamへの変換を単純化します。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- private const string CAR_PHOTO_DIR_NAME = "FuelTracker" ;
 - private static void SaveCarPhoto( string fileName、BitmapImage carPicture、
 - アクションエラーコールバック)
 - {
 - if (carPicture == null ) return ;
 - 試してみる
 - {
 - 使用 ( var store = IsolatedStorageFile.GetUserStoreForApplication())
 - {
 - var bitmap = new WriteableBitmap(carPicture);
 - var path = Path.Combine(CAR_PHOTO_DIR_NAME、fileName);
 - if (!store.DirectoryExists(CAR_PHOTO_DIR_NAME))
 - {
 - store.CreateDirectory(CAR_PHOTO_DIR_NAME);
 - }
 - 使用 ( var stream = store.OpenFile(path、 FileMode .Create))
 - {
 - Extensions.SaveJpeg(ビットマップ、ストリーム、
 - bitmap.PixelWidth、bitmap.PixelHeight、0、100);
 - }
 - }
 - }
 - catch (IsolatedStorageException)
 - {
 - errorCallback();
 - }
 - }
 
次の図は、 Carオブジェクトが分離ストレージにどのように格納されるかを示しています。
      分離ストレージからデータを読み取る
分離ストレージ内のディクショナリからオブジェクトを読み取るには、目的のオブジェクトのキーを指定するだけです。 次のコードは、分離ストレージのディクショナリから値を抽出する方法を示しています。 これは、「クラスデータへのアクセスの使用」セクションのCarDataStore.Carプロパティコードですが、今回はデータストレージに関する詳細が含まれています。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- プライベート 静的車車;
 - 公共の 静的な車車
 - {
 - 得る
 - {
 - if (car == null )
 - {
 - if (appSettings.Contains(CAR_KEY))
 - {
 - car =(車)appSettings [CAR_KEY];
 - car.Picture = GetCarPhoto(CAR_PHOTO_FILE_NAME);
 - }
 - 他に
 - {
 - car = new Car()
 - {
 - FillupHistory = new ObservableCollection <Fillup>()
 - };
 - }
 - }
 - 車を返す ;
 - }
 - {car = value ; }
 - }
 
このコードでは、 Carプロパティにまだ値がない場合、辞書にCAR_KEY定数で指定されたキーの値が含まれているかどうかがチェックされます。 (定数を使用すると、IntelliSenseを使用して値を選択できます。これにより、タイプミスの可能性を回避できます。)既存の値がない場合、 Carオブジェクトの新しいインスタンスとそのFillupHistoryプロパティが初期化されます 。 それ以外の場合、 Carは辞書から取得されます。 ただし、 Car.PictureプロパティはBitmapImage型であり、 シリアル化できないことに注意してください 。 IsolatedStorageSettingsディクショナリはシリアル化可能な値のみをサポートするため、 Pictureプロパティは個別に処理する必要があります。
分離ストレージからファイルを読み取るには、IsolatedStorageFile.OpenFileメソッドを使用します。 次のコードは、隔離されたストレージから画像を取得するFuel TrackerアプリケーションのGetCarPhotoメソッドを示しています。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- プライベート 静的 BitmapImage GetCarPhoto( string fileName)
 - {
 - (IsolatedStorageFile store =
 - IsolatedStorageFile.GetUserStoreForApplication())
 - {
 - string path = Path.Combine(CAR_PHOTO_DIR_NAME、fileName);
 - if (!store.FileExists(path)) return null ;
 - IsolatedStorageFileStreamストリーム=
 - store.OpenFile(パス、 FileMode .Open);
 - 試してみる
 - {
 - var image = new BitmapImage();
 - image.SetSource(ストリーム);
 - 画像を返す ;
 - }
 - ついに
 - {
 - stream.Dispose();
 - }
 - }
 - }
 
分離ストレージからデータを削除する
状態辞書から値を削除するには、IsolatedStorageSettings.Removeメソッドを呼び出してキーを指定します。 次に、IsolatedStorageSettings.Saveメソッドを呼び出して、変更を適用します。 分離ストレージからファイルを削除するには、IsolatedStorageFile.DeleteFileメソッドを呼び出します。
次のCarDataStore.DeleteCarメソッドは、状態辞書から値を削除し、ファイルを削除する方法を示しています。
*このソースコードは、 ソースコードハイライターで強調表示されました。
- public static void DeleteCar()
 - {
 - 車= null ;
 - appSettings.Remove(CAR_KEY);
 - appSettings.Save();
 - DeleteCarPhoto();
 - DeleteTempCarPhoto();
 - }
 
CarDataStore.DeleteCarメソッドは最初にCarプロパティをnullに設定し、将来アクセスされた場合に再初期化できるようにします。 次に、 CAR_KEYエントリがApplicationSettingsディクショナリから削除され、変更を適用するためにSaveメソッドが呼び出されます。 最後に、この方法は隔離されたストレージから車の写真を削除します。
インターフェース設計の推奨事項:
データを上書きまたは削除する、または元に戻せないアプリケーションアクションには、[キャンセル]ボタンが必要です。
次の部分