KiiCloud

ひとりKii Cloud Advent Calendar 2014-12-8

More than 3 years have passed since last update.

この記事は、ひとりKii Cloud Advent Calendarの8日目の記事です。


8日目「オブジェクトを作ったり、取得したり」

ようやくログインまで実装できたので、次はバックエンドの基本的な機能の1つ、データ保存をやってみる。


スコープについて

データにはアクセス制限がデフォルトでついてるので、ここでおさらい。公式ドキュメントを読んだほうがてっとり早いかも。

スコープ
追加や更新できる人
読める人

Application
ログイン済みのユーザー
ログインしてないユーザーも含めて全員

Group
グループにいるユーザー
グループにいるユーザー

User
指定したユーザー
指定したユーザー

他のユーザーに見えたら困るデータはUserスコープを使い、アプリ全員で読めるお知らせや設定的なデータはApplicationスコープを使う といった使い分けができる。しかも、このルールは後からAPIである程度変更できる。

まずは定番の、ユーザー毎にメモを保存して取り出す機能をぱぱっと実装してみた。コードはこちら


オブジェクトを作る

保存する部分。保存先のKiiBucketオブジェクトと、データ本体となるJSONObjectを作る。JSONObjectなので割と何でも入る。

private void createMemo(String titie) {

KiiBucket bucket = new KiiBucket(mUser, Constants.BUCKET_NAME_MEMO);
JSONObject data = new JSONObject();
try {
// スキーマが無いので好き勝手にフィールドを作れる。
// もちろん後から変更も可能。
data.put(FIELD_TITLE, titie);
} catch (JSONException e) {
// nop
}

mAPI.objectAPI().create(bucket, data, new ObjectAPI.ObjectCallback<KiiBucket, KiiObject>() {
@Override
public void onSuccess(KiiObject kiiObject) {
// リストに追加
addItem(kiiObject);
}
@Override
public void onError(Exception e) {
Toast.makeText(getActivity(), R.string.user_scope_err_create, Toast.LENGTH_SHORT).show();
}
});
}

この辺、公式SDKとは違うスタンスを取っているのが非公式ライブラリの特徴。KiiBucketやKiiObjectはあくまで「データのいれもの」で、アップロードやダウンロードはKiiVolleyAPI#objectAPI()などで取得するAPIオブジェクト経由で行う。


オブジェクトを検索して取得する

次は検索。検索はバケツ単位なので注意。今回は条件で絞り込みはせず、更新時刻順にソートだけ指示。

final KiiBucket bucket = new KiiBucket(mUser, Constants.BUCKET_NAME_MEMO);

// 検索条件オブジェクトを作る。
// 引数のKiiClauseオブジェクトでSQLのwhere句っぽい指定ができる。
final QueryParams params = new QueryParams(KiiClause.all());
params.sortByDesc("_modified");

mAPI.bucketAPI().query(bucket, params, new BucketAPI.QueryCallback<KiiBucket, KiiObject>() {
List<KiiObject> list = new ArrayList<>();
@Override
public void onSuccess(QueryResult<KiiBucket, KiiObject> kiiObjects) {
list.addAll(kiiObjects);
if (kiiObjects.hasNext()) {
mAPI.bucketAPI().query(bucket, params, this);
return;
}
setItems(list);
}

@Override
public void onError(Exception e) {
Toast.makeText(getActivity(), R.string.user_scope_err_load, Toast.LENGTH_SHORT).show();
}
});