SHOEISHA iD

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

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

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

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

RDBとの比較で理解する、MBaaSのデータストアの基本

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


ダウンロード StampTime_03.zip (2.2 MB)

クラスを事前に作成しないでレコードを追加する

 では次に、クラスを事前に作成しないでAndroidのアプリから、いきなりレコードを追加する例を作成していきましょう。

 前回は、ログインとログアウト処理、それから、ユーザー登録の処理を作成しました。

MainActivityのオプションメニュー
MainActivityのオプションメニュー

 ログアウトは、図のようにMainActivityのオプションメニューから呼び出すのでしたね。

 このオプションメニューから、新規タスクメニューを選択したら、タスク(仕事)を追加する画面を表示するようにします。

新規Javaクラスの作成
新規Javaクラスの作成
新規Android XMLファイルの作成
新規Android XMLファイルの作成

  まず、srcフォルダにTaskAddActivityを追加し、res/layoutフォルダにXMLファイルactivity_taskaddを追加しましょう。

リスト1 MainActivityのonOptionsItemSelected
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    case R.id.menu_add:(1)
        Intent intent1 = new Intent(MainActivity.this,TaskAddActivity.class);   
        startActivity(intent1); 
        return true;
    case R.id.menu_sum:
        return true;
    case R.id.menu_logout:
        // ログアウト
        try {
            NCMBUser.logOut();
            Intent intent3 = new Intent(MainActivity.this,LoginActivity.class);
            startActivity(intent3); 
        } catch(NCMBException e) {
            Toast.makeText(this,"エラー: " + e.getLocalizedMessage(),Toast.LENGTH_LONG).show();
        }
        return true;
    }
    return false;
}

 MainActivityのonOptionsItemSelectedメソッドにTaskAddActivityを呼び出すコードを追加します。(1)から始まる4行です。TaskAddActivityを呼び出すIntent(インテント)をstartActivityメソッドの引数に指定して画面を遷移します。

タスク登録画面
タスク登録画面
リスト2 activity_taskadd.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: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=".TaskAddActivity">
    
    <EditText
        android:id="@+id/TaskName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="タスク名"
        />
    
    <Button
        android:id="@+id/AddTaskButton"(1)
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="登録"
        />
    <Button
        android:id="@+id/CancelAddTaskButton"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_margin="16dp"
        android:text="キャンセル"
        />
    
</LinearLayout>

 タスク登録画面を作っているのは、リスト2のactivity_taskadd.xmlです。タスク名を入力するためのEditText(エディトテキスト)が一つとNCMBのデータストアのクラスにレコードを追加するButton、それから、タスクの登録をキャンセルするButtonを配置します。

 AddTaskButton(1)がタップされたときの処理が、今回解説したいところです。

リスト3 TaskAddActivity.java
package jp.co.easier.stamptime;

import com.nifty.cloud.mb.NCMBACL;
import com.nifty.cloud.mb.NCMBException;
import com.nifty.cloud.mb.NCMBObject;
import com.nifty.cloud.mb.NCMBUser;
import com.nifty.cloud.mb.SaveCallback;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class TaskAddActivity extends Activity {
    private EditText mTaskName;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_taskadd);

        mTaskName = (EditText)findViewById(R.id.TaskName);

        Button btnAdd = (Button) findViewById(R.id.AddTaskButton);
        btnAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                // オブジェクトの保存
                NCMBObject task = new NCMBObject("TaskClass");(1)
                task.put("taskName", mTaskName.getText().toString());

                NCMBACL taskACL = new NCMBACL();(2)
                // 読み込みは全員
                taskACL.setPublicReadAccess(true);(3)
                // 更新・削除は登録したユーザーのみ
                taskACL.setWriteAccess(NCMBUser.getCurrentUser(),true);
                task.setACL(taskACL);
                
                task.saveInBackground(new SaveCallback() {(4)
                    @Override
                    public void done(NCMBException e) {
                        if (e == null) {
                            // オブジェクト保村成功!
                            Toast.makeText(getApplication(), "タスク登録成功!", Toast.LENGTH_SHORT).show();
                            Intent intent = new Intent(TaskAddActivity.this,MainActivity.class);
                            startActivity(intent);  
                        } else {
                            // Sign up 失敗!
                            Toast.makeText(getApplication(), "失敗!", Toast.LENGTH_SHORT).show();
                        }
                    }
                });

            }
        });
        Button btnCancel = (Button) findViewById(R.id.CancelAddTaskButton);
        btnCancel.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finish();   // Activityの終了
            }
        });
    }

}

 その処理は当然、TaskAddActivity.javaに記述します。(1)から始まるコードです。NCMBObjectクラスのコンストラクタにTaskClassを指定して、taskオブジェクトを生成します。このときに、データストアにTaskClassが作成済であっても、作成してなくても構いません。

 次に、NCMBObjectのputメソッドでKey-Value値を指定します。taskNameというフィールド名で、エディトテキストmTaskNameに入力された値をgetText().toString()で文字列として取得します。

 そして、saveInBackgroundメソッドでデータストアに保存します(4)。InBackgroundが付くのは非同期のメソッドです。引数にコールバックを指定しているので、保存処理がうまく行くと「タスク登録成功!」とトースト表示して、MainActivityに戻ります。

「メールサーバー構築」と入力して登録ボタンを押す
「メールサーバー構築」と入力して登録ボタンを押す

 タスク名に「メールサーバー構築」と入力して登録ボタンを押しました。

データストアにTaskClassが作成され、レコードが追加されている
データストアにTaskClassが作成され、レコードが追加されている

 NCMBの管理画面を開くと、データストアにプログラムで指定したTaskClassが作成されて、レコードが登録されていることが確認できます。taskNameフィールドにメールサーバー構築と入力されていますね。TaskClassではユーザー定義のフィールドはtaskName一つだけなのですが、複数ある場合は、putメソッドでフィールドの数だけKey-Value値を指定していけば良いのです。

次のページ
aclにはパーミッションを設定する

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

MBaaSと連携するAndroidアプリを作る連載記事一覧

もっと読む

この記事の著者

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

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

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

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

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/8126 2014/10/16 19:47

イベント

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

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

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

メールバックナンバー