Windows Phone 7のデータアクセス概要

Windows Phone 7といえばイケてるUIに目を奪われがちですが、実際にアプリケーションを開発する時にはデータアクセスが必要になることが多いと思います。今日はWindows Phone 7のデータアクセスについて全体像を学んで、どのような選択肢があり、それぞれにどのような特徴があるのか見極めて頂きたいと思います。次回以降では、さらに深堀して詳細を確認します。

  ※ Silverlight 限定ですのでご注意ください。(XNAには言及しません)

 

まず、データの保管場所として、いくつか選択肢があるので図を見ながら確認してみましょう。

DataSources

 

クライアントサイド

・Local File 

開発したSilverlightのxapに含まれるReadOnlyのファイルです。設定ファイルなどの用途で利用します。

・Isolated Storage(分離ストレージ)   

ユーザー固有のデータの読み書きに利用されます。

 

サーバーサイド

・Database(つまりWeb サービス) 

インターネット上のDBです。WCFなどのサービスを利用してデータにアクセスします。

 

Silverlight開発の経験がある方であれば、すぐ理解できるかもしれませんが、そんなん知らねーよ。。。という方のために、もう少し詳しく確認していきましょう。

■Local File

テキストやXMLのようなプレーンなファイルを扱うことが可能です。大きくはリソースファイルコンテンツファイルの2種類に分類できます。

a 

・リソースファイル

リソースファイルはアセンブリに組み込まれ、アプリケーションやライブラリから利用できます。Application.GetResourceStream メソッドを使ってアクセスできます。リソースファイルを利用すると、リソース情報がアプリ内に閉じた状態で実装できるため配布が容易になります。ただし、後述のコンテンツファイルと比較するとアセンブリ中の複数ファイルの読み出しが必要になるため、アプリの起動に時間がかかる可能性があるので注意が必要です。

通常、以下のケースで利用されます。

        - アプリケーションの起動時間に対するプライオリティが低い

        - アセンブリをコンパイルした後にリソースファイルを変更する必要がない

        - 関連ファイルの数を減らすことでアプリケーション配布をシンプルにしたい

 

・コンテンツファイル(上図ではリソースファイルになっています)

コンテンツファイルはアセンブリではなく、直接.xapに含まれます。このファイルは複数のアセンブリからシェアして利用することができます。Windows Phone 7では、デスクトップアプリと比べると比較的シンプルなアプリが多いと思うので、リソースファイルと比較すると使い勝手がよいかもしれませんね。XElement.Loadメソッドなどを使ってファイルにアクセスします。

通常、以下のケースで利用されます。

- アセンブリをコンパイルした後にリコンパイルなしでコンテンツファイルを変更したい

- アプリケーションの起動時間のプライオリティが高い

 

 

■Isolated Storage (分離ストレージ)

Windows Phone 7ではセキュリティ上、OSのファイルシステムに直接アクセスできません。そこで同様の処理を行いたい場合、この分離ストレージを利用することになります。このストレージ機能を利用することで、ユーザー固有の情報を読み書きが可能になります。分離ストレージを利用するには2つの方法があります。

IsolatedStorageSettings

分離ストレージにキーと値のペアを保存、検索できます。

IsolatedStorageFile

分離ストレージにファイルを読み書きできます。

 

※さらなる情報はこちらにIsolated Storage QuickStart.

 

 

■Database(つまりWeb サービス)

Windows Phone 7を使ってWebサービス経由でデータを読み書きする技術は複数存在します。

・HTTP Classes

System.Net 名前空間のHttpWebRequest/HttpWebResponse 、もしくは WebClient を利用することで直接サーバーネットワークにアクセスできます。これらのクラスを用いるとHTTPプロトコル上で利用可能なWebサービスに対してリクエストを送ることができます。典型的には(自身がコントロールできない)サードパーティがホストしており、レスポンスがXMLもしくはJSONのサービスに対して利用します。ただし、自分自身でサービスを構築するのであれば、次にご紹介するWCFを使うのがよいでしょう。

参考

   Building a REST Web Service Client QuickStart.

  Connecting to Web and Data Services for Windows Phone

   HTTP Communication and Security with Silverlight.

 
・WCF Services

WCFを利用すればサービスを公開したり、Windows Phone 7からサービスを利用することが容易です。Windows Phone 7でも従来のようにVisual Studio の「サービス参照の追加」機能であったり、SLsvcUtil.exeを利用して、クライアントプロキシクラスを生成できます。プロキシクラスがあれば、まるでローカルデータにアクセスしてるかのごとく、サービスにアクセスできますよね。

参照

Networking in Silverlight for Windows Phone.

Using SLsvcUtil.exe to Access a Service.

How to: Access a Service from Silverlight.

 
・WCF Data Services (OData services)

オープンなデータプロトコルであるODataに対応したRESTスタイルのサービスにアクセスします。AtomPubとJSONフォーマットに対応します。特にCRUD処理に特化した開発ではおあすすめです。尚、OData用のクライアントライブラリ(OData Client library on Codeplex)を別途インストールして頂く必要があります。現在(Oct 27 2010, Stable)はVisual Studioの「サービス参照の追加」が利用できなかったり、LINQによるデータアクセスが出来なかったり、いろいろ注意すべき点はあります。

参照

Open Data Protocol (OData) Overview for Windows Phone

How to: Consume an OData Service for Windows Phone.

 

・Windows Azure Storage Services

Windows Phone 7ではAzure Storageを活用できます。というかAzure StorageにはRESTのAPIが公開されているので、インスタンスを立てる必要もなく安価でスケーラブルなStorage Servicesが利用できるのは非常に大きなメリットなのです。今後は積極的に利用して頂きたいストレージですね。

参考

Storing Data in the Windows Azure Platform for Windows Phone.

 

 

まとめ

シナリオ 推奨アプローチ
アセンブリに組み込まれたRead Onlyのデータを扱いたい ローカル リソースファイル
リコンパイルなしでRead Onlyのデータを更新したい ローカルコンテンツファイル
ユーザー固有のデータの保存、検索などしたい 分離ストレージ
サードパーティーのREST、POXのサービスを利用したい HTTP Classes
RSSフィードにアクセスしたい HTTP Classes
SOAPサービスにアクセスしたい WCF
ODataにアクセスしたい WCF Data Services
Auzre Storageにアクセスしたい HTTP Classes、WCF、WCF Data Services

 

 

リソース情報

・Windows Azure と Windows Phone 7 を使用してデータ駆動型アプリケーションを構築する

https://msdn.microsoft.com/ja-jp/magazine/gg490344.aspx

・Getting Data into your Windows Phone Applications

https://create.msdn.com/en-US/education/quickstarts/Getting_Data_into_your_Windows_Phone_Applications#WebServiceTerminology

・Windows Azure Platform Training Kit - February Update

https://www.microsoft.com/downloads/en/details.aspx?FamilyID=413e88f8-5966-4a83-b309-53b7b77edf78&displaylang=en