Как я могу заставить мою базу данных Firebase читать только непосредственных дочерних элементов данной ссылки - PullRequest
0 голосов
/ 26 мая 2020

Я начинающий программист и работаю над проектом в Android Studio, используя firebase. Я структурировал свою БД, чтобы сохранять мужчин в одном каталоге, а женщин - в другом (пользователи), чтобы упростить последующие функции приложения. Структура basi c приведена ниже

Изображение макета моей базы данных

В какой-то момент в моем коде я хочу проверить, является ли определенный пользователь мужчиной или женский, и это код, который я использую для этого. Однако это дает мне нежелательные результаты. В нем говорится, что пользователь - мужчина и женщина.

код ниже:

  DatabaseReference mUsers = FirebaseDatabase.getInstance().getReference().child("Users");

Это ссылка на моих пользователей.

  mUsers.child("Male").addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                    if(dataSnapshot.getKey().equals(userId)){
                        gender = "Male";
                        Log.i("The_current's_gender", gender);
                        mUsers.child(gender).child(userId).child("connections").child("nope").child(currentUserId).setValue(true);
                    }else{
                        gender = "Female";
                        Log.i("The_current's_gender", gender);
                        mUsers.child(gender).child(userId).child("connections").child("nope").child(currentUserId).setValue(true);
                    }
                }

И это фрагмент проблемной части.

Это работает правильно, без ошибок, однако я получаю информацию журнала, в которой говорится, что мой пользователь является одновременно мужчиной и женщиной. Как я могу структурировать прослушиватель событий, чтобы указать пол человека? Я попытался найти документацию по слушателям, но ничего не помогает.

1 Ответ

0 голосов
/ 26 мая 2020

Похоже, у вас в базе данных есть такая структура:

Male: {
  "uidOfMaleOne": ...,
  "uidOfMaleTwo": ...
}

Когда вы присоединяете ChildEventListener к Male, его onChildAdded вызывается по очереди с каждым дочерним узлом. Скажем, мы uidOfMaleOne, затем при первом вызове onChildAdded dataSnapshot.getKey() соответствует нашему UID, поэтому мы устанавливаем gender = "Male". Но затем при втором вызове onChildAdded dataSnapshot.getKey() соответствует не нашему UID, и мы устанавливаем gender = "Female".

Вероятно, вы захотите загрузить только один узел в этой структуре: имя текущего пользователя. Что-то вроде:

mUsers.child("Male").child(userId).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            gender = "Male";
            Log.i("The_current's_gender", gender);
            mUsers.child(gender).child(userId).child("connections").child("nope").child(currentUserId).setValue(true);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {
        throw databaseError.toException();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...