Windows Phone 7のデータアクセス概要
Windows Phone 7といえばイケてるUIに目を奪われがちですが、実際にアプリケーションを開発する時にはデータアクセスが必要になることが多いと思います。今日はWindows Phone 7のデータアクセスについて全体像を学んで、どのような選択肢があり、それぞれにどのような特徴があるのか見極めて頂きたいと思います。次回以降では、さらに深堀して詳細を確認します。
※ Silverlight 限定ですのでご注意ください。(XNAには言及しません)
まず、データの保管場所として、いくつか選択肢があるので図を見ながら確認してみましょう。
クライアントサイド
・Local File
開発したSilverlightのxapに含まれるReadOnlyのファイルです。設定ファイルなどの用途で利用します。
・Isolated Storage(分離ストレージ)
ユーザー固有のデータの読み書きに利用されます。
サーバーサイド
・Database(つまりWeb サービス)
インターネット上のDBです。WCFなどのサービスを利用してデータにアクセスします。
Silverlight開発の経験がある方であれば、すぐ理解できるかもしれませんが、そんなん知らねーよ。。。という方のために、もう少し詳しく確認していきましょう。
■Local File
テキストやXMLのようなプレーンなファイルを扱うことが可能です。大きくはリソースファイルとコンテンツファイルの2種類に分類できます。
・リソースファイル
リソースファイルはアセンブリに組み込まれ、アプリケーションやライブラリから利用できます。Application.GetResourceStream メソッドを使ってアクセスできます。リソースファイルを利用すると、リソース情報がアプリ内に閉じた状態で実装できるため配布が容易になります。ただし、後述のコンテンツファイルと比較するとアセンブリ中の複数ファイルの読み出しが必要になるため、アプリの起動に時間がかかる可能性があるので注意が必要です。
通常、以下のケースで利用されます。
- アプリケーションの起動時間に対するプライオリティが低い
- アセンブリをコンパイルした後にリソースファイルを変更する必要がない
- 関連ファイルの数を減らすことでアプリケーション配布をシンプルにしたい
・コンテンツファイル(上図ではリソースファイルになっています)
コンテンツファイルはアセンブリではなく、直接.xapに含まれます。このファイルは複数のアセンブリからシェアして利用することができます。Windows Phone 7では、デスクトップアプリと比べると比較的シンプルなアプリが多いと思うので、リソースファイルと比較すると使い勝手がよいかもしれませんね。XElement.Loadメソッドなどを使ってファイルにアクセスします。
通常、以下のケースで利用されます。
- アセンブリをコンパイルした後にリコンパイルなしでコンテンツファイルを変更したい
- アプリケーションの起動時間のプライオリティが高い
■Isolated Storage (分離ストレージ)
Windows Phone 7ではセキュリティ上、OSのファイルシステムに直接アクセスできません。そこで同様の処理を行いたい場合、この分離ストレージを利用することになります。このストレージ機能を利用することで、ユーザー固有の情報を読み書きが可能になります。分離ストレージを利用するには2つの方法があります。
分離ストレージにキーと値のペアを保存、検索できます。
分離ストレージにファイルを読み書きできます。
※さらなる情報はこちらに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.
・WCF Services
WCFを利用すればサービスを公開したり、Windows Phone 7からサービスを利用することが容易です。Windows Phone 7でも従来のようにVisual Studio の「サービス参照の追加」機能であったり、SLsvcUtil.exeを利用して、クライアントプロキシクラスを生成できます。プロキシクラスがあれば、まるでローカルデータにアクセスしてるかのごとく、サービスにアクセスできますよね。
参照
Networking in Silverlight for Windows Phone.
・WCF Data Services (OData services)
オープンなデータプロトコルであるODataに対応したRESTスタイルのサービスにアクセスします。AtomPubとJSONフォーマットに対応します。特にCRUD処理に特化した開発ではおあすすめです。尚、OData用のクライアントライブラリ(OData Client library on Codeplex)を別途インストールして頂く必要があります。現在(Oct 27 2010, Stable)はVisual Studioの「サービス参照の追加」が利用できなかったり、LINQによるデータアクセスが出来なかったり、いろいろ注意すべき点はあります。
参照
・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
・Windows Azure Platform Training Kit - February Update