クラスを事前に作成しないでレコードを追加する
では次に、クラスを事前に作成しないでAndroidのアプリから、いきなりレコードを追加する例を作成していきましょう。
前回は、ログインとログアウト処理、それから、ユーザー登録の処理を作成しました。
ログアウトは、図のようにMainActivityのオプションメニューから呼び出すのでしたね。
このオプションメニューから、新規タスクメニューを選択したら、タスク(仕事)を追加する画面を表示するようにします。
まず、srcフォルダにTaskAddActivityを追加し、res/layoutフォルダにXMLファイルactivity_taskaddを追加しましょう。
@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メソッドの引数に指定して画面を遷移します。
<?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)がタップされたときの処理が、今回解説したいところです。
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に戻ります。
タスク名に「メールサーバー構築」と入力して登録ボタンを押しました。
NCMBの管理画面を開くと、データストアにプログラムで指定したTaskClassが作成されて、レコードが登録されていることが確認できます。taskNameフィールドにメールサーバー構築と入力されていますね。TaskClassではユーザー定義のフィールドはtaskName一つだけなのですが、複数ある場合は、putメソッドでフィールドの数だけKey-Value値を指定していけば良いのです。



