Получить список пользователей из таблицы-1, затем сравнить с данными из таблицы-2 - PullRequest
0 голосов
/ 28 декабря 2018

Я получаю список пользователей из таблицы data-1, как видно из кода ниже.

    DatabaseReference rootReference = FirebaseDatabase.getInstance().getReference();
    DatabaseReference reference = rootReference.child("data-1")
    ValueEventListener listener= new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            final ArrayList<String> userList= new ArrayList<>();
            for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
                String foundUserId= dSnapshot.getKey();
                if (condition) {
                    userList.add(foundUserId);   
                    //step one completed: userList is full with all necessary users
                    //Now how to iterate it and compare it with data from table-2?
                }

            }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
            Log.d(TAG, databaseError.getMessage());
        }
    };

    reference.addListenerForSingleValueEvent(listener);

}

Пока все хорошо, userList найдет всех пользователей из таблицы data-1.Но мне все еще нужно отфильтровать некоторых пользователей и добавить их во второй список с именем filteredUserList.Мне нужно отфильтровать их, сравнивая каждого пользователя с текущим пользователем, который сохранен в переменной final currentUserId

Я получаю список пользователей из data-1, где у каждого пользователя есть список пользователей вэто так:

data-1
  |_____uid1
  |      |_____uid3: true
  |      |_____uid4: true
  |
  |_____uid25
         |_____uid34: true
         |_____uid101: true

Вы видите в data-1 каждый пользователь имеет список пользователей под ним, как я впервые заполнил userList.

table-2имеет узел метки времени, и это его структура:

table-2
   |
   |____userid1
   |         |
   |         |_____timestamp: timestamp
   |
   |____userid2
             |
             |_____timestamp: timestamp

      //and so on..

Что я хочу сделать, после того, как я userList заполнен пользователями, мне нужно проверить, находится ли каждый пользователь timestamp в пределах определенногодельта времени от текущего пользователя.Поэтому мне нужно повторить userList и сравнить каждого пользователя timestamp с текущим пользователем timestamp.Но я не могу заставить его работать, потому что для получения метки времени каждого пользователя мне нужен новый onDataChange, и в цикле for, но это выходит за рамки, и это также асинхронно, поэтому он никогда не работает!Каков будет правильный способ заставить это работать?Я пытался больше недели.Возможно ли это сделать?

1 Ответ

0 голосов
/ 28 декабря 2018

Самое простое решение, которое я могу придумать, - это получить текущего пользователя timestamp, а затем запросить весь узел users и сравнить текущего пользователя timestamp с другими временными метками пользователя.

Iнеобходимо отфильтровать их, сравнивая каждого пользователя с текущим пользователем

. Чтобы решить эту проблему, используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users")
DatabaseReference uidRef = usersRef.child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long currentUserTimestamp = dataSnapshot.child("timestamp").getValue(Long.class);
        String currentUserKey = dataSnapshot.getKey();

        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    long timestamp = dataSnapshot.child("timestamp").getValue(Long.class);
                    if(currentUserKey != ds.getKey()) {
                        if(currentUserTimestamp > timestamp) {
                            //Do something
                        } else {
                            //Do something else
                        }
                    }
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        usersRef.addListenerForSingleValueEvent(eventListener);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);

Редактировать: Согласно комментариям и отредактированному вопросу, смотрите код ниже:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference table2Ref = rootRef.child("table-2");
DatabaseReference uidRef = table2Ref.child(uid);
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        long currentUserTimestamp = dataSnapshot.child("timestamp").getValue(Long.class);
        String currentUserKey = dataSnapshot.getKey();

        DatabaseReference currentUserKeyRef = rootRef.child("data1").child(currentUserKey);
        ValueEventListener eventListener = new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot ds : dataSnapshot.getChildren()) {
                    String userKey = ds.getKey();

                    DatabaseReference userKeyRef = table2Ref.child(userKey);
                    ValueEventListener listener = new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {
                            for(DataSnapshot d : dataSnapshot.getChildren()) {
                                long timestamp = d.child("timestamp").getValue(Long.class);
                                if(currentUserTimestamp > timestamp) {
                                    //Do something
                                } else {
                                    //Do something else
                                }
                            }
                        }

                        @Override
                        public void onCancelled(@NonNull DatabaseError databaseError) {
                            Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
                        }
                    };
                    userKeyRef.addListenerForSingleValueEvent(listener);
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
            }
        };
        currentUserKeyRef.addListenerForSingleValueEvent(eventListener);
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
uidRef.addListenerForSingleValueEvent(valueEventListener);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...