Отслеживание ответов пользователей в FireBase - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь отследить, сколько пользователей ответили в моей базе данных Firebase, и мне интересно, каков наилучший рабочий процесс. Я хочу отправить уведомление последнему пользователю, чтобы ответить.

Моя база данных firebase организована так, как сейчас

├── chat 
│   ├── -M5D96yP5Ac688-ZPU0C << chatId 1
│   │   ├── info
│   │   │   ├── groupName: Breakfast Club
│   │   │   ├── id: -M5D96yP5Ac688-ZPU0C
│   │   │   ├── last_reply_from: 8J7PX3ezjMTuOiAPO1BbOGJGP1g1
│   │   │   ├── no_of_users: 4
│   │   │   └── Users:
│   │   │       ├── 8J7PX3ezjMTuOiAPO1BbOGJGP1g1: true
│   │   │       ├── QvmGG2vPfTrdjZBfWP2ZotajYE3: false
│   │   │       ├── y1EKihfmIJTDCD9OJt0N89WDC643: false
│   │   │       └── zQvmGG2vPfTrdjZBfWP2ZotajYE3: false
│   │   └──Messages
│   │           .....
├── user


И я собирался сделать следующее.

  1. подсчитать количество пользователей и добавить в поле "no_of_users" с помощью getChildrenCount ()
  2. подсчитать, сколько пользователей имеют значение true в качестве значения
  3. вычесть одно из другого, и если = = 1, затем отправьте уведомление
  4. сбросьте все значения пользователей на false и начните заново.
    private void checkReplies() {
         final DatabaseReference chatInfoDb = FirebaseDatabase.getInstance().getReference().child("chat").child(mChatObject.getChatId()).child("info").child("users");
         final DatabaseReference numberOfUsers = FirebaseDatabase.getInstance().getReference().child("chat").child(mChatObject.getChatId()).child("info").child("no_of_users");
         Query query = chatInfoDb.orderByValue().equalTo(true);
         query.addListenerForSingleValueEvent(new ValueEventListener() {
             @Override
             public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                 final long howManyReplies = dataSnapshot.getChildrenCount();
                 System.out.println("How many users have replied " + howManyReplies);

                 numberOfUsers.addListenerForSingleValueEvent(new ValueEventListener() {
                     @Override
                     public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                         long numberOfUser = (long) dataSnapshot.getValue();
                         long maths = numberOfUser - howManyReplies;

                         if(maths == 1){
                             Query query = chatInfoDb.orderByValue().equalTo(false);
                             query.addListenerForSingleValueEvent(new ValueEventListener() {
                                 @Override
                                 public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                                     for(DataSnapshot childsnapshot : dataSnapshot.getChildren()) {
                                         String lastToReply = childsnapshot.getKey();

                                         runSomethingElse(lastToReply);
                                     }
                                 }
                                 @Override
                                 public void onCancelled(@NonNull DatabaseError databaseError) {
                                 }
                             });
                         }
                     }

Но теперь мне интересно, будет ли лучше получить ответ " msgstr "и добавьте пользователей в ответ, затем используйте myRef.removeValue (), чтобы убрать все ответы. Кажется, что было бы проще, чем перебрать всех пользователей, чтобы снова установить для них значение false. например,

│   ├── -M5D96yP5Ac688-ZPU0C << chatId 1
│   │   ├── info
│   │   │   ├── groupName: Breakfast Club
│   │   │   ├── id: -M5D96yP5Ac688-ZPU0C
│   │   │   ├── last_reply_from: 8J7PX3ezjMTuOiAPO1BbOGJGP1g1
│   │   │   ├── no_of_users: 4
│   │   │   ├── Users:
│   │   │   │   ├── 8J7PX3ezjMTuOiAPO1BbOGJGP1g1: true
│   │   │   │   ├── QvmGG2vPfTrdjZBfWP2ZotajYE3: true
│   │   │   │   ├── y1EKihfmIJTDCD9OJt0N89WDC643: true
│   │   │   │   └── zQvmGG2vPfTrdjZBfWP2ZotajYE3: true
│   │   │   └── replies:
│   │   │       ├── 8J7PX3ezjMTuOiAPO1BbOGJGP1g1: true
│   │   │       └── zQvmGG2vPfTrdjZBfWP2ZotajYE3: true
│   │   └──Messages
│   │           .....

Что из этого будет наиболее эффективным для этого? Или есть другой способ отследить это.

Большое спасибо!

1 Ответ

0 голосов
/ 27 апреля 2020

Вместо того, чтобы усложнять ваши узлы, как это, имейте super node, который отслеживает ответы определенного идентификатора чата, каждый раз, когда пользователь добавляет свои идентификаторы к этому super node. Примерно так:

Replies
|
|
|-------------M5D96yP5Ac688-ZPU0C << chatId 1
              |
               -----8J7PX3ezjMTuOiAPO1BbOGJGP1g1: true
               -----QvmGG2vPfTrdjZBfWP2ZotajYE3: true
|
|
|-------------QRE36yP5Ac688-ZPU0C << chatId 2
              | 
               -----8J7PX3ezjMTuOiAPO1BbOGJGP1g1: true

Всякий раз, когда вы хотите проверить, кто еще не ответил

при входе в чат l oop через пользователей в поговорите и проверьте, существуют ли идентификаторы в этом суперузле, если нет, то отправьте уведомление После этого просто удалите chatID из супер-узла. И начните сначала.

ОБНОВЛЕНИЕ:

Я объясню еще раз.

Конечно, я предполагаю, что у вас есть список UID в чате из вашей базы данных я вижу это. Теперь вот шаги, чтобы узнать, какой пользователь ответил, а какой нет:

1) Когда пользователь отвечает, добавьте его / ее UID в supernode в Replies/chatID.

2) До сих пор это означает, что наличие UID пользователя в Replies/chatID означает, что он ответил.

3) Когда вы хотите проверить, какой пользователь ответил, вы выполняете запрос к пользователям текущего чата, и я oop через них. И проверьте, существуют ли их UID под Replies/chatID. Если да, они ответили, если нет - не ответили.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...