ダウンロード StampTime_04.zip (2.3 MB)
本記事は、MBaaSである「ニフティクラウド mobile backend(NCMB)」と連携するAndroidアプリ開発の解説記事です。グループウェアとしてタスク(仕事)に費やした時間を記録、集計するアプリを作ってみます。今回は、MBaaSのデータストアの高度な使い方として、リレーショナルなデータを扱う方法について説明します。
はじめに
前回は、データストアの基本について、リレーショナルデータベース(RDB)と比較しながら解説し、ダッシュボードからデータストアにクラスを作成してみました。最後には、Androidのプログラムから、事前にクラスを作成せずに、データストアにレコード(クラスのオブジェクト)を保存する方法を説明しました。MBaaSのKey-Value形式のデータストアの基本が理解できたかと思います。
今回は、関連オブジェクトの保存と取得に進みます。前回に引き続き、データストアの仕組みをRDBと比較しながら解説します。
対象読者
MBaaSと連携するAndroidアプリを開発したい方。JavaとEclipseについては解説しませんので、JavaとEclipseの基本的な知識があると読みやすいでしょう。
必要な環境
- JDK
- Eclipse
- Android SDK
- ニフティクラウド Mobile backend Basic(無料版)
関連オブジェクトとは何かをRDBとの比較で知る
さて、今回はいきなり「関連オブジェクト」という名前が出てきたので、面食らわれたかもしれませんね。今回やりたいことをまずRDBベースで説明しましょう。
商品マスタがすでに登録されていて、売上データを作成するイメージです。RDBではデータの矛盾や重複を避けるために、冗長なデータを記録しません。たとえば、売上データにおいて、商品を一意に識別する商品IDさえあれば、商品名は省略できます。また、コンビニのように定価販売しかしないのであれば、単価も商品マスタ上にだけあればよいということになります。
よって、この場合、売上データには、売上データを一意に識別するIDと売上日付、そして、商品を指定するための商品IDと数量があればよいという考え方になります。売上金額は数量と商品マスタの単価を掛けて求めればよいし、消費税額は売上日で適正な消費税率を求めて計算すればよいということになります。
データベースの正規化という考え方を用いれば、これが正しいテーブル設計ということになりますが、現実的はさまざま理由で冗長に思えるフィールドも定義することが多いです。
そして、売上データを表示するときは、商品IDを使って商品名と単価を取得します。RDBの場合は参照したいテーブルの主キーを、自分のテーブル(のフィールド)に外部キーとして持つことで、他のテーブルとの関連(リレーション)を築いていくわけです。
MBaaSでリレーショナルなデータを扱う
では、NCMBのデータストアのクラスではどうでしょうか。前回作成したTaskClassには、タスク名(仕事の名前)を登録していくのでしたね。
| フィールド名 | データ型 | 内容 | User/System |
|---|---|---|---|
| objectId | 文字列 | ID | System |
| taskName | 文字列 | タスク名 | User |
| createDate | 日付 | 作成日時 | System |
| updateDate | 日付 | 更新日時 | System |
TaskClassにはレコード(オブジェクト)として、グループでやらなくてはいけない仕事をどんどん登録していきます。たとえばWebシステムを開発している小規模な会社やグループを考えると良いでしょう。A社の受注管理のシステムやB社の進捗管理のシステムといろいろ案件があり、案件を分解すると、提案書の作成、システム設計から始まり、サーバー設定、プログラミング、テスト、メンテナンスといろいろやることがあります。これらの単位で仕事をタスクとして登録するイメージです。
そして、このアプリの利用者はこれらのタスクの内、複数のタスクに関与します。たとえば、mさんはA社の受注管理のシステムの提案と設計とテストを担当し、nさんはA社の受注管理のシステムのプログラミングとB社の進捗管理のシステムのプログラミングに関わるという感じです。
担当者は、自分がどのタスクにどれくらいの時間を掛けたのかを知りたい。そして、管理者はグループとしてそのタスクにどれくらい時間が掛かっているのか集計したい。そんな想定のアプリを作っていきます。
そこで、担当者はあるタスクに取り掛かるときに、Android端末に表示されるたくさんのタスクの内、どれかをタップします。これがそのタスクを始めますという操作になります。
タスクをタップしたら、CurTaskClassのオブジェクトを作成します。CurTaskClassのフィールドをみていきましょう。objectIdはシステムが自動的に付けてくれるオブジェクトの識別用IDです。UserNameにはログインしているユーザーの名前を保存します。そして、次のtaskが重要です。taskはUserNameさんが始めた仕事を表します。
| フィールド名 | データ型 | 内容 | User/System |
|---|---|---|---|
| objectId | 文字列 | ID | System |
| UserName | 文字列 | getCurrentUser()の戻り値 | User |
| task | 参照 | taskClassオブジェクトへの参照 | User |
| startTime | 日付 | 開始日時 | User |
| createDate | 日付 | 作成日時 | System |
| updateDate | 日付 | 更新日時 | System |
リレーショナルデータベースの世界では、taskフィールドにはTaskClassのobjectIdを入れるところですが、NCMBのデータストアでは、関連オブジェクトへの参照を記録します。関連オブジェクトへの参照とは、別のクラスのあるオブジェクト(レコード)を指すポインタです。NCMBでは関連オブジェクトとしてリレーションを表現します。
そして、startTimeには、そのタスクを始めますよとタップした日時を記録します。これで、ある人があるタスクを始めた時間が記録できるわけです。
この記事は参考になりましたか?
- MBaaSと連携するAndroidアプリを作る連載記事一覧
-
- MBaaSでつくろう、Androidアプリのプッシュ通知! しくみと手順を大解剖
- MBaaSのクエリと集計処理を実装する
- MBaaSのデータストアの高度な使い方~リレーショナルなデータを扱う
- この記事の著者
-
金宏 和實(カネヒロ カズミ)
富山県高岡市出身で在住。ソフトウェア開発者兼ライター。株式会社イーザー関西学院大学文学部仏文科卒。第一種情報処理技術者(今で言うと、応用情報技術者。第一種→ソフ開→応用と変遷したようだ)主な著書『作ればわかる!Androidプログラミング第2版 -SDK4対応-』『VS 2010で作る Web-DB アプリ入門』『ベテランが丁寧に教えてくれるデータベースの知識と実務』『はじめてのAndroidアプリ作成 センサー活用とクラウド連携』『はじめてのAndroidアプリ作成 基本プログラミング』Web連載『VB2008で楽々Webプログラミング』『再発見!VB2005快適プログラミング』 『こうしろうのMindStroms日記』 個人的なブログはこちらです。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
