MBaaS徹底入門――Kii Cloudでスマホアプリ開発

第6回 Kii Cloudを用いたチャットアプリケーションの開発 [その2] ―友達追加機能の実装

この記事を読むのに必要な時間:およそ 4.5 分

前回は,チャットアプリケーションの全体像/データフローを示し,その後に「サインアップ(サインイン)⁠機能について解説しました。

第6回となる今回は,他のユーザを友達リストに追加する「友達追加」機能について解説します。ユーザは友達リストから話したい友達を選び,チャットを開始することになります。

なお前回と同様,今回使用したソースコードについては,GitHubで公開しています。

友達追加機能の実装

実装に入る前に,前回説明した友達追加機能について簡単に確認してみましょう。

友達追加機能は,次の2つのフローにより成り立ちます。

友達追加時のデータフロー

友達追加時のデータフロー

友達候補の取得

サインアップの際,アプリケーションスコープの⁠chat_users⁠バケットにユーザ情報を登録しているため,このバケットはアプリケーションに登録している全ユーザの情報を含んでいます。このバケットに対して検索をかけることで,友達候補を取得します。

友達リストへの追加

1で取得した友達候補から,友達リストに追加したいユーザを選択します。選択したユーザはユーザスコープの⁠chat_friends⁠バケットに追加され,チャットを開始する際に選択できます。

この2つのフローの実装について,以下で説明していきます。

①友達候補の取得

友達候補の取得処理をもう少し小さい処理に分割すると,以下のようになります。

  1. ユーザの入力から検索キーワードを取得する
  2. ユーザネームもしくはEmailが検索キーワードから始まるユーザを,⁠chat_users⁠バケットから取得する
  3. 取得したユーザのリストを表示する

この中で,Kii Cloudへのアクセスが含まれているのは,2つ目の「ユーザネームもしくはEmailが検索キーワードを含むユーザを取得する」です。この実装について見ていきましょう。

なお,以降では,前回同様,GitHubに掲載しているコードと少しコメントの内容・位置が異なっている場合があります。あらかじめご了承ください。

まず,UserListLoaderクラスを見ていきます。

このクラスではActivity側で入手したユーザ入力を検索キーワードとして,コンストラクタでセットします。セットした検索キーワードを用いて,友達候補を取得する処理をバックグラウンドで実行します。処理終了後,結果を元のActivityに渡します。

public class UserListLoader extends AbstractAsyncTaskLoader<List<ChatUser>> {
	
    private String keyword;
	
    public UserListLoader(Context context, String keyword) {
        super(context);
        
        // Activity側で取得した検索キーワードをセットする
        this.keyword = keyword;
    }

    @Override
    public List<ChatUser> loadInBackground() {
        List<ChatUser> users = new ArrayList<ChatUser>();
        try {
            
            // 友達候補(キーワードにマッチするユーザ)を取得する
            List<ChatUser> results = ChatUser.searchByKeyword(keyword);
            for (ChatUser user : results) {
                // サインイン中のユーザ(=検索実行中のユーザ自身)は検索結果から除外する
                if (!TextUtils.equals(user.getUri(), KiiUser.getCurrentUser().toUri().toString())) {
                    users.add(user);
                }
            }
        } catch (Exception e) {
            Logger.e("Unable to list users", e);
        }
        return users;
    }
}

UserListLoaderクラス内で,友達候補取得のために実行するメソッドはChatUser#searchByKeyword(String keyword)です。このメソッド内でAndroid Cloud SDKのAPIを実行しています。具体的には,KiiBucket#query(KiiQuery query)を実行して,⁠chat_users⁠バケット下にあるオブジェクトの内,条件にマッチしたオブジェクトを取得しています。

クエリ実行時の条件は,KiiClauseクラスにより指定します。

KiiQueryクラスの生成時に与えるKiiClauseクラスのインスタンスにより,⁠特定のフィールドの値が等しい」⁠あるフィールドの値が指定した値よりも大きい」などの条件を扱うことができます。KiiClauseクラスは論理演算子(and, or)をサポートしているため,複数の条件を組み合わせることも可能です。

以下の例では,⁠ "username" もしくは “email” フィールドの値が検索キーワードで始まるオブジェクト」という条件を使っています。

public class ChatUser extends KiiObjectWrapper implements IUser {

    // “chat_users”バケット: アプリケーションの全ユーザの情報が登録されている
    private static final String BUCKET_NAME = "chat_users"; 

    private static final String FIELD_USERNAME = "username";
    private static final String FIELD_EMAIL = "email";

    public ChatUser(KiiObject user) {
        super(user);
    }
	
    public static KiiBucket getBucket() {
        return Kii.bucket(BUCKET_NAME);
    }

    public static List<ChatUser> searchByKeyword(String keyword) throws Exception {
        KiiQuery query = null;
        
        // *(アスタリスク)を指定した場合,全ユーザを取得する
        if (TextUtils.equals("*", keyword)) {
            query = new KiiQuery();
        } else {
            query = new KiiQuery(

    
                // 取得した検索キーワードから始まる”username”/”email”フィールドの値を検索する
                KiiClause.or(                    
                    KiiClause.startsWith(FIELD_USERNAME, keyword),
                    KiiClause.startsWith(FIELD_EMAIL, keyword)
                )
            );
        }
        List<ChatUser> users = new ArrayList<ChatUser>();
        List<KiiObject> objects = getBucket().query(query).getResult();

        // ChatUserはKiiObject(オブジェクトを表すAndroid Cloud SDKのクラス)から作成する
        for (KiiObject object : objects) {
            users.add(new ChatUser(object));
        }
        return users;
    }
    …
}

著者プロフィール

藤井達朗(ふじいたつろう)

Kii株式会社

http://www.kii.com/

コメント

コメントの記入