0

Firebaseでは、さまざまなサンプルに記載されているように、チャットなどの「ルーム」を簡単に作成できます。

チャットのデータ構造については、次のようなものを使用します。

rooms
    room1
        member_count
        members
            user1
            user2
        messages
            message1

しかし今、私はルームごとの参加者数に制限を設けたいと考えています。たとえば、チャット ルームごとに 3 人のユーザーとします。

どうすればこれを行うことができますか?

彼らのドキュメントで最も有望に見えたのは、transactionを使用することでした。これが良い方法であることを確認できますか? それとも、これは間違ったアプローチですか?

このような解決策はどうですか?

Firebase countRef = new Firebase("https://mychat.firebaseIO-demo.com/rooms/room1");
countRef.runTransaction(new Transaction.Handler() {
    @Override
    public Transaction.Result doTransaction(MutableData currentData) {
        int oldMemberCount = currentData.child("member_count").getValue(Integer.class);
        currentData.child("member_count").setValue(oldMemberCount + 1); // try to update member count
        return Transaction.success(currentData);
    }

    @Override
    public void onComplete(FirebaseError error, boolean committed, DataSnapshot currentData) {
        if (error != null || !commited) {
            // rollback value (how? just do nothing?)
        }
        else {
            // transaction has been commited (value has already been saved?)
            currentData.child("members").child(CURRENT_USER_UUID).setValue(CURRENT_USER_NAME); // add user to the members list
        }
    }
});

このアプローチについてコメントいただければ幸いです。さらに、トランザクションが失敗した場合、もちろんその状況で満足することはできません。同時に参加しようとしている別のユーザーがいたとしても、ユーザーは引き続き参加したいと考えています。では、どうする?このコードを関数に入れ、エラーの場合に関数を再度呼び出しますか?

編集:

自動的に一意の ID を持つ新しいルームを作成するには、参照に対してpush()Firebaseを使用できます。

ただし、そのルームにメンバーを追加する場合は、上記の問題が残ります。別の解決策として、参加時にメンバー リストでユーザーの優先順位を設定することもできます。優先順位を現在のタイムスタンプに設定すると、メンバー リストのコールバックを 3 (メンバー) に制限できます。しかし、それはエレガントでもクリーンでもないようです。

4

1 に答える 1