XamarinからAzure DocumentDB(NoSQL)を利用する

これまでXamarinからは、(サーバを経由せず)直接DocumentDBに接続することはできませんでした。

しかし!How To Build Planet Scale Mobile App in Minutes with Xamarin and DocumentDBでアナウンスがあったように、ついにXamarinから直接DocumentDBに接続することが可能になりました(両方とも個人的な推し技術なので一人で舞い上がってます・・)。

これが実現した背景には、.NET Core対応のDocumentDB SDKがリリースされたことがあるのですが、個人的にはXamarinを.NET Standardで使うきっかけにもなる出来事にもなりました(いろいろ苦労もしました)。

DocumentDBを使うメリット

データベースはサーバ経由で接続すればいいじゃないと思うかもしれませんが、DocumentDBはJSONドキュメントを非常に高速に読み/書きできるNoSQLデータベースです。モバイルアプリからサーバを経由せずに高速にデータを読み書きできる環境は、スムーズさが求められるモバイルアプリにとって強力な武器になると個人的には思っています。

DocumentDB自体の詳細は、Azure公式Docs「DocumentDB の概要: NoSQL JSON Database」に任せるとして、DocumentDBを使っていて個人的にうれしいと感じているポイントを羅列しておきます。

  • スキーマフリー: POCOをそのままJSONとしてDBに突っ込める柔軟さ
  • SQLが使える: ほぼ普通のSQL文法が使える
  • 速い: SQL DBとは比較にならないくらい速い(読み取り遅延の99%は10ミリ秒未満、書き込み遅延は15ミリ秒未満)
  • 管理不要: いわゆるPaaSなので
  • スケーラビリティ: たぶん、普通のアプリでは不要なほど、とんでもなくスケールできる

DocumentDBアカウントの作成

Azure上でDocumentDBアカウントを持っていない場合は、以下の手順に従ってアカウントとデータベースまで作成して下さい。なお、データベースまでであればお金はかかりません。費用が発生するのはコレクション(SQLでいうテーブル的なもの)作成以降です。

Xamarin.Formsプロジェクトの作成

これは個人的にもびっくりしたのですが、AzureポータルでDocumentDBのクイックスタートにアクセスすると、DocumentDBに接続できるXamarin.Formsプロジェクトが生成できるようになっています。

Xamarinで使えるDocumetDBのSDKは、.NET Coreベースなので、Xamarin環境は、.NET Standardで構成しなければなりません。なお、クイックスタートでダウンロードしたプロジェクトはPCLではなくSharedProjectになっていました。

PCLにトライしてみるも・・

PCLでも構築できないかと、@yu_ka1984さんの記事「Xamarin.FormsのPCLプロジェクトを.NET Standardライブラリプロジェクトにしてみた(*’▽’)」を参考に設定を進めてみましたが、「PCLが.NET Standard 1.6ターゲットをサポートしていない」という問題があるようで、.NET Standard 1.6以上が要件となっている「DocumetDB .NET Core SDK」は、PCLには導入できませんでした。

当面はSharedプロジェクト構成にする必要があるようです。

DocumentDBへのアクセス

ダウンロードしたXamarin.FormsプロジェクトはおなじみのTodoアプリです。

デバッグで画面を立ち上げて適当にアイテムを追加してみると、まるでローカルに書き込んでいるかのようなスムーズさで、データを登録できます。

DocumentDBにデータが入っていることを確認するには、ポータルのドキュメントエクスプローラーやクエリエクスプローラーで参照できます。Xamarinアプリで入力したデータがそのままJSONドキュメントとして保存されていることがわかります。

XamarinでのDocumentDB活用に向けて

応用的な使い方は追って紹介していきたいと思いますが、基本的にはクイックスタートで生成されたプロジェクトの「TodoItemManager」のようなDB接続用の(リポジトリ的な)クラスを用意しておけば、あとはローカルのSQLiteにアクセスする時と同じように実装すれば良いと思います。

ただし、本格開発にあたっては、DocumentDBへのキー情報をXamarin.Formsのソースコードには残さないような工夫が必須です。本家のブログでは認証時にキーを受け取るような処理を紹介していましたが、何らかのタイミングでAPIからアクセスキーを受け取るような仕組みは必要だと思います。

また、クイックスタートで作成するDocumentDBのコレクションは、自動的に400RUという単位で作成されるので(月額およそ3000円〜4000円くらい)、試し終わったらすぐに削除することをおすすめします。削除後にJSONデータだけ保存しておきたい場合は、以前の記事「DocumentDBのコレクションをJSONにエクスポートする」を参考にして下さい。

最初から金額を気にせずにローカルで開発するには、@beach_sideさんの記事「Azure DocumentDB のEmulatorを使って Quick Start」で紹介されているDocumentDBのエミュレータを使う手もあります。