3. チュートリアル1 : TODOアプリの実装

ここではチュートリアル1の実装について解説します。

3.1. NEC BaaS Android SDK ライブラリ

NEC BaaS Android SDK を利用するためには、アプリケーションに SDK のライブラリファイル 群を追加する必要があります (チュートリアルではすでにセットアップ済みです)

必要なライブラリファイルを libs ディレクトリ以下に格納し、build.gradle に依存関係を追記します。

詳細手順については「Java / Android SDK ガイド」の「SDKセットアップ手順」の章を ご参照ください。

3.2. Application クラス

Application を継承したクラスを実装し、この中で NEC BaaS Android SDK の初期化処理を行います。

チュートリアル1では MainApplication クラスを実装しています。 なお、本クラスは AndroidManifest.xml の application タグの name 属性に指定しておく 必要があります。

アプリケーションクラスの初期化処理を抜粋します。

/**
 * アプリケーションクラス
 */
public class MainApplication extends Application {
    private NbService mService;

    private static final String TAG = "MainApplication";

    private static MainApplication sApplication;

    @Override
    public void onCreate() {
        Log.d(TAG, "onCreate");
        super.onCreate();

        sApplication = this;

        // サーバ自己署名証明書を許可する。
        // 呼び出しはNbServiceの生成前に行うこと。
        // デバッグ用なので、本番時には使用しないこと!!!
        // (本番時は正規のサーバ証明書を使用すること)
        //NbttpClient.getInstance().setAllowSelfSignedCertificate(true);

        // BaaS 初期化処理。NbService を生成する。
        mService = new NbAndroidServiceBuilder(this, Consts.TENANT_ID, Consts.APP_ID, Consts.APP_KEY)
                .setEndPointUri(Consts.ENDPOINT_URI)
                .build();
    }

SDK を初期化するには、最初に NbAndroidServiceBuilder クラスを使用します。 NbAndroidServiceBuilder のコンストラクタには、以下のパラメータを設定します。

  • Context
  • テナントID
  • アプリケーションID
  • アプリケーションキー

また、setEndpointUri() でエンドポイントURIを指定してください。

最後に、build() を呼び出すと NbService のインスタンスが得られます。 以降の API 呼び出しでは、この NbService を中心に使用します。

注釈

サーバ側が正規の証明書を使用していない場合(自己署名証明書)は、証明書の検証をスキップする必要があります。 スキップする場合は setAllowSelfSignedCertificat() で設定します。

注釈

オフライン機能を使用する場合には、NbAndroidServiceBuilder にオフライン機能の設定が必要です。 本チュートリアルではオフライン機能は使用しませんので、省略しています。

3.3. MainActivity クラス

アプリケーション本体は MainActivity クラスに実装します。 本クラスは ListActivity を継承しており、Todo をリストで表示します。

3.3.1. 初期化

/**
 * 初期化処理
 */
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // NbService インスタンスを取得
    mService = MainApplication.getInstance().getNebulaService();

    // ListView のセットアップ
    mArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,
            new ArrayList<String>());
    ListView listView = this.getListView();
    listView.setAdapter(mArrayAdapter);
    listView.setOnItemLongClickListener(this);

    // バケットを取得
    mBucket = mService.objectBucketManager().getBucket("TodoTutorial1");

    // サーバから TODO データの読み込みを実行
    loadTodos();
}

初期化は onCreate() で行います。

最初に、MainApplication クラスが保持する NbService のインスタンスを取得し、mService に保存します。

次に、ListView のセットアップを行います。本実装では、ArrayAdapter に Todo を文字列を格納します。

3.3.2. バケットの取得

// バケットを取得
mBucket = mService.objectBucketManager().getBucket("TodoTutorial1");

バケットの取得を行うには、オブジェクトバケットマネージャを使用します。 NbService.objectBucketManager() でオブジェクトバケットマネージャを取得し、 getBucket() を呼び出してバケットを取得します。

3.3.3. Todo 一覧の取得

/**
 * Todo データをサーバから取得する
 */
private void loadTodos() {
    NbQuery query = new NbQuery();
    query.setSortOrder("updatedAt", true);

    mBucket.query(query, new NbObjectCallback() {
        @Override
        public void onSuccess(List<NbObject> objects, Number num) {
            mTodoList = objects;
            refresh();
        }

        @Override
        public void onFailure(int statusCode, NbErrorInfo errorInfo) {
            showAlert("Load todo failed");
        }
    });
}

loadTodos() で、サーバから Todo データの一覧を取得します。

Todo データは NbObjectBucket.query() を使用して取得できます。 クエリ(取得条件)は NbQuery クラスのインスタンスとして作成します。 クエリでは、検索するオブジェクトの絞込み、ソート条件の指定、スキップ件数・件数上限の指定などが可能です。 ここでは更新日時(updatedAt)フィールド昇順で、全件取得するというクエリを作成しています。

注意

件数上限はデフォルトで100件となっています。 一回のクエリで 100件以上のデータを取得したい場合は、クエリ条件で件数上限値を明示的に指定する必要があります。

query() が成功すると、onSuccess() が呼ばれます。 データは NbObject の List として取得されます。これを mTodoList に保存し、refresh() を 呼び出して画面を更新します。

3.3.4. 画面更新

/**
 * 画面更新
 */
private void refresh() {
    mArrayAdapter.clear();
    if (mTodoList == null) return; // do nothing

    for (NbObject todo : mTodoList) {
        String s = todo.getString("description", "-");
        mArrayAdapter.add(s);
    }
}

画面更新は refresh() で行います。

サーバから取得した Todo データは mTodoList に格納されていますので、 この中のデータを ArrayAdapter に順次格納します。

NbObject 内のフィールドは getXxx メソッドで取得することができます。 ここでは "description" フィールドに Todo のテキストを入れることを想定しています。

3.3.5. Todo の追加

画面右上の Add ボタンを押すと、Todo の追加処理に移ります。 この処理は onAddTodo() 内で行っています(詳細は省略)。

実際に Todo を追加する処理は、addTodo() で行います。

/**
 * Todo 追加処理
 * @param s
 */
private void addTodo(String s) {
    // オブジェクト生成
    NbObject todo = mBucket.newObject();

    // 値を設定
    todo.put("description", s);

    // オブジェクト保存
    todo.save(new NbObjectCallback() {
        @Override
        public void onSuccess(List<NbObject> objects, Number num) {
            // リロードする
            loadTodos();
        }

        @Override
        public void onFailure(int status, NbErrorInfo errorInfo) {
            showAlert("save object failed");
        }
    });
}

Todo データを NbObject として生成します。 NbObject の生成は、NbBucket.newObject() で行います。

つぎに、データの description フィールドに Todo のテキストをセットします。

データの保存には save() メソッドを使用します。save() を呼び出すと、サーバにデータが送信されます。 保存が成功したら onSuccess() が呼ばれますので、画面更新の処理を行います。 (ここでは loadTodos() を呼び出して全データをリロードしています)。

3.3.6. Todo の削除

/**
 * Todo の削除処理
 */
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view,
        int position, long id) {
    NbObject todo = mTodoList.get(position);

    todo.deleteObject(new NbResultCallback() {
        @Override
        public void onSuccess() {
            // Todo をリロードする
            loadTodos();
        }

        @Override
        public void onFailure(int statusCode, NbErrorInfo errorInfo) {
            showAlert("delete failed");
        }
    });

    return true;
}

Todo の削除処理は、onItemLongClick() 内で行います。 本処理は、Todo を長押ししたときに呼び出されます。

mTodoList から、該当 NbObject インスタンスを取得し、 deleteObject() を呼び出すと、サーバに削除指示が送信されます。

削除が正常に完了すると onSuccess() が呼び出されますので、画面をリロードします。