SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

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

MBaaSのクエリと集計処理を実装する

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

  • X ポスト
  • このエントリーをはてなブックマークに追加

 本記事は、MBaaSである「ニフティクラウド mobile backend(NCMB)」と連携するAndroidアプリ開発の解説記事です。グループウェアとしてタスク(仕事)に費やした時間を記録、集計するアプリを作ってみます。今回は、クエリと集計処理について説明します。

  • X ポスト
  • このエントリーをはてなブックマークに追加

はじめに

 前回は、データストアに関連オブジェクトを含むレコードを保存して、取得してみました。やるべきタスクの名前を登録したTaskClassからボタンを複数作成して、そのボタンをタップすると、そのタスクを開始したことを表すCurTaskClassにレコードを作成するようにプログラムを作成しました。

 CurTaskClassはフィールドとしてTaskClassのオブジェクトへの参照を持ちます。そして、選択したタスクのボタンを再度、タップすると開始日時と終了日時、そして、その差分を分単位で記録した経過時間、ログインしているユーザー名、それから、TaskClassのオブジェクトへの参照を持つLogClassのレコードを、CurTaskClassから作成するようにプログラミングしました。

 今回はこのLogClassからクエリでレコードを抽出し、経過時間を集計する処理を作成してみます。

対象読者

 MBaaSと連携するAndroidアプリを開発したい方。JavaとEclipseについては解説しませんので、JavaとEclipseの基本的な知識があると読みやすいでしょう。

必要な環境

  • JDK
  • Eclipse
  • Android SDK
  • ニフティクラウド Mobile backend Basic(無料版)

どんなクエリを作るのか

 まず、LogClassのレコードを抽出して集計します。どんな集計のパターンが考えられるでしょうか。

データストア LogClass
フィールド名 データ型 内容 User/System
objectId 文字列 ID System
UserName 文字列 getCurrentUser()の戻り値 User
task 参照 taskClassオブジェクトへの参照 User
startTime 日付 開始日時 User
endTime 日付 終了日時 User
elapsedTime 数値 経過時間(分単位) User
createDate 日付 作成日時 System
updateDate 日付 更新日時 System

 まず、担当者は自分がどのタスクにどれだけ時間を掛けたかを知りたいので、UserNameで抽出することが必要になります。逆に管理者はUserNameを指定しないで、全体でどのタスクにどれだけ時間が掛かったかを集計します。

 次に期間です。累計の時間が知りたい場合は、日付の範囲を指定する必要はありませんが、今月はどのタスクにどれだけ時間が掛かったか、今週はどんな感じかなどを知りたいときは、日付の範囲で抽出できるようにします。

 これらのパターンをまとめると集計処理の画面は次のようになります。

集計処理の画面
集計処理の画面

 集計画面のレイアウトファイルであるactivity_sum.xmlと一緒にみていきましょう。なお、本稿のサンプルコードは記事に添付していますので、ダウンロードし、併せてご覧ください。

リスト1 activity_sum.xml(抜粋)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/LinearLayout1"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".SumActivity" >

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="#aaaaaa"
        android:text="@string/fromTo"(1)
        android:gravity="center"
        android:textSize="16sp"
        />

 一番外側には、LinearLayoutがあります。一番上に表示されるTextViewは背景色をグレイ(#aaaaaa)にして、期間範囲指定とテキスト表示しています。これまで、見た目のわかりやすさや手軽さのため、textやhintプロパティに直接テキスト文字列を記述していましたが、res/values/strings.xmlに登録する方法が推奨されています。また、国際化対応をする場合、strings.xmlに登録する必要がありますので、今回はstrings.xmlに表示する文字列を記述しています(1)

リスト2 strings.xml
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string name="app_name">タスクタイマ</string>
    <string name="action_settings">Settings</string>
    <string name="app_key">ここにアプリケーションキーを記述する</string>
    <string name="client_key">ここにクライアントキーを記述する</string>
    <string name="menu">メニュー</string>
    <string name="addTask">新規タスク</string>
    <string name="sum">集計</string>
    <string name="logout">Logout</string>
    <string name="fromTo">期間範囲指定</string>
    <string name="btnFrom">開始日付を選択</string>
    <string name="btnTo">終了日付を選択</string>
    <string name="sumWho">集計対象</string>
    <string name="meOnly">自分</string>
    <string name="allMember">全体</string>
    <string name="sumStart">集計実行</string>
    <string name="cancel">戻 る</string>
    <string name="sumResult">集計結果</string>
</resources>

 次に、orientationプロパティにhorizontalを指定したLinearLayoutを配置して、その中にTextViewとButtonを置きます。

リスト3 activity_sum.xml(抜粋)
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textViewFrom"
        android:layout_width="100dp"
        android:layout_height="26dp"
        android:textSize="16sp"
        android:background="@drawable/frame"(2)
        android:padding ="3dp"(3)
        />
    <Button
        android:id="@+id/buttonFrom"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnFrom"
        />
</LinearLayout>

 このTextViewには指定された開始日付を表示します。また、その右にあるButtonは「開始日付を選択」と表示しているように、タップされたら、datePickerDialogを表示します。

datePickerDialogの表示
datePickerDialogの表示

 datePickerDialogでは、年、月、日を縦スクロールして選択することができます。設定ボタンをタップすると、左のTextViewに選択された日付を文字列として表示するわけですが、そのTextViewのプロパティにも注目してください。

 backgroundプロパティに指定している@drawable/frameは、resディレクトリ以下にdrawableディレクトリを作成し、そこにframe.xmlという名前で作成したファイルを指します(2)

リスト4 frame.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#FFFFFF"/>
    <stroke android:width="2dp" android:color="#aaaaaa" />
</shape>

 frame.xmlでは、shapeタグでrectangle(長方形)を描画します。その長方形にはstrokeで、2dpのグレイの枠線を描いています。このようにしないと、TextViewがどこにあるのかわかりにくいからです。もう一つ、注意したいのはpaddingプロパティです(3)。3dp内側にスペースをとるように指定しています。このようにpaddingで空白をあけないと、枠線と表示する文字列が重なってしまいます。

 TextViewではなく、EditTextを使えば枠線を描画してくれるのですが、ここでは日付の書式をyyyy-mm-ddに簡単に固定したかったので、直接文字入力できないようにTextViewを使いました。yyyy-mm-dd形式にしたかった理由は後ほど説明します。

 次のLinearLayoutの中は終了日付です。TextViewのプロパティなどは開始日付と同じです。ボタンを押すと、同様にdatePickerDialogを開きます。

リスト5 activity_sum.xml(抜粋)
<LinearLayout
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/textViewTo"
        android:layout_width="100dp"
        android:layout_height="26dp"
        android:textSize="16sp"
        android:background="@drawable/frame"
        android:padding ="3dp"
        />
    <Button
        android:id="@+id/buttonTo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/btnTo"
        />
</LinearLayout>

 集計対象と表示しているTextViewの下にRadioGroupがあります(4)

リスト6 activity_sum.xml(抜粋)
<RadioGroup (4)
   android:id="@+id/rgSum"
   android:orientation="horizontal"
   android:layout_width="match_parent"
   android:layout_height="wrap_content" >
    <RadioButton
        android:id="@+id/rbMeOnly"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checked="true"
        android:text="@string/meOnly" />
    <RadioButton
        android:id="@+id/rbAll"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/allMember" />
</RadioGroup>

 RadioGroupはRadioButtonをグループ化します。つまり、RadioGroup内に複数のRadioButtonを配置した場合、オンにできるRadioButtonは一つだけになります。このRadioButtonで自分だけのLogClassのレコードを集計するか全体を集計するかを選択したら、ユーザーは集計実行ボタンを押します。戻るボタンを押した場合は、このアクティビティを呼び出したMainActivityに戻ります。

 集計結果は一番下にあるListViewに表示します(5)

リスト7 activity_sum.xml(抜粋)
<ListView android:id="@+id/listView1"(5)
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    />

次のページ
クエリを組み立てる

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
MBaaSと連携するAndroidアプリを作る連載記事一覧

もっと読む

この記事の著者

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

 富山県高岡市出身で在住。ソフトウェア開発者兼ライター。株式会社イーザー関西学院大学文学部仏文科卒。第一種情報処理技術者(今で言うと、応用情報技術者。第一種→ソフ開→応用と変遷したようだ)主な著書『作ればわかる!Androidプログラミング第2版 -SDK4対応-』『VS 2010で作る Web-DB アプリ入門』『ベテランが丁寧に教えてくれるデータベースの知識と実務』『はじめてのAndroidアプリ作成 センサー活用とクラウド連携』『はじめてのAndroidアプリ作成 基本プログラミング』Web連載『VB2008で楽々Webプログラミング』『再発見!VB2005快適プログラミング』 『こうしろうのMindStroms日記』 個人的なブログはこちらです。 

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8217 2014/10/28 14:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング