Windows Azure Mobile Service で独自テーブルを作ってみる

カレンダー – Windows Azure – 技術者でつなぐ日めくりカレンダー の3/4の記事です。関係ないですが、3/4はうちの娘の誕生日です。誕生日プレゼントは何がいい?と聞くと「携帯電話がいい」という答えだったので「みまもり携帯とガラケーとiPhone5cから選べ」と言うと「なんでもいいそうです」欲がないですね…つーか、みまもり携帯だと何にもできないから私が(!)詰まららないですけど。

さて、Windows Azureというと仮想化の話から盛り上がっていたので、それのちょっと前の ひと目でわかるWindows Azureアプリケーション開発入門 を書いた身としては、BLOB と Table ストレージの API はどうなったんですか?ってな感じなのですが、まあ、いまいち Windows Azure に直接接続する API 絡みは流行らなかったんですよね(どうも、Azure 側にいないので事情がよくわからないのですが、感想的に)。当時は、Google の Big Table あたりの話があって、Amazon EC とか「ビックデータ」以前の純粋にでかい検索データをどうやって扱うのか?という点で、BLOB のフラットな構造や SQLと中間的な Table ストレージとかが API 的によいのではないかと思っていたのですが、いやはや、撃沈しております。まあ、そんなにでかいデータなんてそうそう必要ないって現実ですよね。本格的に業務で使うにしても、ほどよい柔軟性とアクセスがしやすければレンタルサーバーで十分な訳です…と思ったけど、仮想化の話が続くのだから、それはそれでVPSの移行なりで辛い思いをするよりはいいのかな?

■モバイルサービスを試してみる

MSDNを持っているので、単体でのWindows Azureの課金状態を忘れてしまったのですが、モバイルサービスでアクセスするデータベースは SQL Serverを使います(内部的にもSQL Serverなのかな?)。以前 SQL Azure と言われていたときはデータベースを扱うときに結構な値段になったので、あまりお勧めできなかったのですが「無料の20MB」ってことで、ちょっとした設定ぐらいならば Azure サーバーに置くのもありかな、と思ったりします。大量なデータは BLOB やらテーブルストレージやらがいいんでしょうが、そんなことをするよりも仮想マシンを使ってMySQLに落とし込んだほうが楽みたいですね。

image

モバイルサービス自体が何ぞや?ってことに関しては、モバイル サービス | Windows Azure と読む…のかな。プッシュ通知にメリットは、【第1回】がりっち勉強会 in 東京開催しました!! | がりっち勉強会 あたりにあります。自前サーバーを作らなくてもモバイルサービスを使えばプッシュ通知が作れますって話です。

簡単なToDoアプリのサンプルは、モバイルサービスを作ったあとにクイックスタートから各種のサンプルアプリがダウンロードできます。

image

※あれ?PhoneGapがあるけど最近増えましたっけ?

■ToDoサンプルのテーブル

自動作成されるテーブルは、こんな感じです。

image

Azure側のファイアーウォールを設定してやると、SQL Server Management Studio でも接続できます。データの編集とかはこっちのほうが楽でしょう。

image

CREATE TABLE [todomasuda].[TodoItem](
	[id] [nvarchar](255) NOT NULL,
	[__createdAt] [datetimeoffset](3) NOT NULL,
	[__updatedAt] [datetimeoffset](3) NULL,
	[__version] [timestamp] NOT NULL,
	[text] [nvarchar](max) NULL,
	[complete] [bit] NULL,
PRIMARY KEY NONCLUSTERED
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON)
)

というテーブルが作られますが、これを独自に作ってみましょう、ってのがこの記事の本題です。やっと本題ですね。ToDoアプリだけダウンロードして、その先はどうするの?ってことで途方に暮れてしまったので、そのメモもかねて。

■独自にテーブルを作る

「データ」→「作成」で新しいテーブルを作ります。

image

新しいテーブルができたら、テーブル名をクリックして「列」タブを選択します。

image

文字列型のid列と、その他(__createdAt, __updatedAt, __version)という列が作られます。どうやら、この4つの列があれば最低限動きそうですね。

「Add COLUMN」(日本語化されてませんね)をクリックして「列を追加」します。

image

データ型は、String(文字列)、Number(数値)、Date(日付)、Boolean(ブール値)の4種類だけです。

image

こんな風に対応します。数値はfloatになってます。普通にCREATE文で作ると int 型もできると思ったのですが…Azure側で認識してくれないっぽいので、alter を使うのかな?

image

■テーブルをアクセスするクラスを作る

まずは、プロジェクトに windowsazure.mobileservices のモジュールを Nuget でインストールします。

image

データモデルのクラスを作ります。Azure側の列名と同じにしておくと JsonProperty の属性はいりません。クライアント側のコード規約とかがある場合は設定したほうがいいでしょう。

class OriginalTable
{
    public string id { get; set; }
    public string firstname { get; set; }
    public string lastname { get; set; }
    public DateTime birthday { get; set; }
    public int age { get; set; }
}

リストを取得して表示するだけのコード

public partial class MainWindow : Window
{
    public static MobileServiceClient MobileService = new MobileServiceClient(
        "https://todomasuda2.azure-mobile.net/",
        "<アクセスキー>"
    );

    public MainWindow()
    {
        InitializeComponent();
    }

    /// <summary>
    /// データを取得
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private async void Button_Click(object sender, RoutedEventArgs e)
    {
        var t = MobileService.GetTable<OriginalTable>();
        var data = await t.ToListAsync();
        dg.ItemsSource = data;
    }
}

MobileServiceClient クラスのコンストラクタを作っておいて、GetTable でテーブルを取得。そのあとは LINQ で取得できます。ここでは全件取得しているので ToListAasync しているだけですが、Where 句などを使えます。ここのクエリは API を呼び出すときに検索文字列(のようなもの)に変換されるので、検索を絞ればトラフィックは小さくなります。

データの挿入とか削除は Azure からダウンロードできるサンプルを参照ということで。ここのサンプルは時間を取ってあとで公開しておきましょう。

image

そんな訳で9歳の誕生日おめでとう&Azureの日本データセンターおめでとうございます、という親バカ記事でした。

カテゴリー: 開発, Azure パーマリンク