CodeZine(コードジン)

特集ページ一覧

MBaaSのデータストアの高度な使い方~リレーショナルなデータを扱う

MBaaSと連携するAndroidアプリを作る 第4回

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2014/10/14 14:00

ダウンロード 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の場合(商品マスタと売上データ)
RDBの場合(商品マスタと売上データ)

 商品マスタがすでに登録されていて、売上データを作成するイメージです。RDBではデータの矛盾や重複を避けるために、冗長なデータを記録しません。たとえば、売上データにおいて、商品を一意に識別する商品IDさえあれば、商品名は省略できます。また、コンビニのように定価販売しかしないのであれば、単価も商品マスタ上にだけあればよいということになります。

 よって、この場合、売上データには、売上データを一意に識別するID売上日付、そして、商品を指定するための商品ID数量があればよいという考え方になります。売上金額は数量と商品マスタの単価を掛けて求めればよいし、消費税額は売上日で適正な消費税率を求めて計算すればよいということになります。

注釈

 データベースの正規化という考え方を用いれば、これが正しいテーブル設計ということになりますが、現実的はさまざま理由で冗長に思えるフィールドも定義することが多いです。

 そして、売上データを表示するときは、商品IDを使って商品名単価を取得します。RDBの場合は参照したいテーブルの主キーを、自分のテーブル(のフィールド)に外部キーとして持つことで、他のテーブルとの関連(リレーション)を築いていくわけです。

MBaaSでリレーショナルなデータを扱う

 では、NCMBのデータストアのクラスではどうでしょうか。前回作成したTaskClassには、タスク名(仕事の名前)を登録していくのでしたね。

データストア TaskClass(Taskを登録する)
登録したTaskを更新・削除できるのは登録したユーザーのみ
フィールド名 データ型 内容 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さんが始めた仕事を表します。

データストア CurTaskClass(現在、UserNameが実行中のタスク)
計測開始でCurTaskClassのオブジェクトを作成する
フィールド名 データ型 内容 User/System
objectId 文字列 ID System
UserName 文字列 getCurrentUser()の戻り値 User
task 参照 taskClassオブジェクトへの参照 User
startTime 日付 開始日時 User
createDate 日付 作成日時 System
updateDate 日付 更新日時 System

 リレーショナルデータベースの世界では、taskフィールドにはTaskClassのobjectIdを入れるところですが、NCMBのデータストアでは、関連オブジェクトへの参照を記録します。関連オブジェクトへの参照とは、別のクラスのあるオブジェクト(レコード)を指すポインタです。NCMBでは関連オブジェクトとしてリレーションを表現します。

 そして、startTimeには、そのタスクを始めますよとタップした日時を記録します。これで、ある人があるタスクを始めた時間が記録できるわけです。


  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 金宏 和實(カネヒロ カズミ)

     富山県高岡市出身で在住。ソフトウェア開発者兼ライター。 株式会社イーザー 関西学院大学文学部仏文科卒。第一種情報処理技術者(今で言うと、応用情報技術者。第一種→ソフ開→応用と変遷したようだ) 主な著書 『作ればわかる!Androidプログラミング第2版 -SD...

バックナンバー

連載:MBaaSと連携するAndroidアプリを作る
All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5