KiiCloud

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

More than 3 years have passed since last update.

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


11日目「グループメンバーの管理」

10日目でグループの作成方法は紹介したが、今日はメンバーの話。


初期メンバー付きでグループを作成する

create()の第3引数にKiiUserのリストを渡すだけ。第2引数で指定したオーナーは自動的に含まれるので、わざわざリストにいれる必要はない。

List<KiiUser> members = new ArrayList<>();

members.add(new KiiUser(member1Id));

mAPI.groupAPI().create(groupName, mUser, members, new GroupAPI.GroupCallback<KiiGroup>() { /* */ });


どうやって他のユーザーを見つけるか?

他ユーザーを見つける方法はいくつか方法がある。

1つ目は、find系のAPIを使う方法。リクエスト1回消費する上、識別子(ユーザー名 / メールアドレス / 電話番号)のいずれかが分かっている必要がある。

次は、ユーザー名で検索する例。

void findUserClicked() {

String username = mUsernameEdit.getText().toString();

mAPI.userAPI().findUserByUsername(username, new UserAPI.UserCallback<KiiUser>() {
@Override
public void onSuccess(KiiUser kiiUser) {
Toast.makeText(getActivity(), getString(R.string.find_user_found, kiiUser.getId()), Toast.LENGTH_SHORT).show();
}

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


メンバー一覧を取得する

メンバー一覧はgetMembers()で取得できる。しかし。。。

mAPI.groupAPI().getMembers(group, new GroupAPI.MemberCallback<KiiUser>() {

@Override
public void onSuccess(List<KiiUser> kiiUsers) {

}

@Override
public void onError(Exception e) {

}
});

onSuccess()で取得できるKiiUserは、ユーザーIDしか持っていないオブジェクトだったりする。これサードパーティ製ライブラリの問題ではなく、Kii CloudのAPIがユーザーIDしか返さないため。

なので、メンバーのユーザー名を表示させたい!という場合は、メンバーの数だけgetById()を呼ぶ必要がある。これでは当然ながら使いにくい。。

// 確かに取得はできるが。。。

mAPI.userAPI().getById(user.getId(), new UserAPI.UserCallback<KiiUser>() {
@Override
public void onSuccess(KiiUser kiiUser) {

}

@Override
public void onError(Exception e) {

}
});


ユーザー情報の入ったバケツを作る

バケツに対してはquery()が使えるので、それを利用して1リクエストで全メンバーのデータを取れるようにしておく。

ユーザー登録後に、ユーザー名やその他公開しても大丈夫な情報を含むオブジェクトをApplication Scopeにいれる。

mAPI.signup(info, password, new AppAPI.SignupCallback<KiiUser>() {

@Override
public void onSuccess(KiiUser kiiUser) {
JSONObject userinfo = new JSONObject();
try {
userinfo.put("username", username);
} catch (JSONException e) {
// nop
}
// Application scopeのuserinfoバケツ
KiiBucket bucket = new KiiBucket(null, "userinfo");
// オブジェクトをID指定で作るhack
KiiObject obj = new KiiObject(bucket, kiiUser.getId());
mAPI.objectAPI().save(obj, new ObjectAPI.ObjectCallback<KiiBucket, KiiObject>() {
@Override
public void onSuccess(KiiObject kiiObject) {
Toast.makeText(getActivity(), R.string.signup_done, Toast.LENGTH_SHORT).show();
}

@Override
public void onError(Exception e) {

}
});
}

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

検索はこんな感じ。

List<String> idList = new ArrayList<String>(kiiUser.length());

for (KiiUser u : kiiUsers) {
idList.add(u.getId());
}
KiiBucket bucket = new KiiBucket(null, "userinfo");
QueryParams params = new QueryParams(KiiClause.in("_id", idList.toArray(new String[0])));

mAPI.bucketAPI().query(bucket, params, new BucketAPI.QueryCallback<KiiBucket, KiiObject>() {
@Override
public void onSuccess(QueryResult<KiiBucket, KiiObject> kiiObjects) {

}

@Override
public void onError(Exception e) {

}
});