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 (メンバー) に制限できます。しかし、それはエレガントでもクリーンでもないようです。