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

Мне нужна помощь с запросом к базе данных Firebase Realtime.

У меня есть следующий список пользователей, который выглядит так: введите описание изображения здесь

Я хочу реализовать что-то вроде экрана поиска, который будет отображать всех пользователей, но у меня проблема с получением данных из firebase.

Вот метод отправки запросов в Firebase .

public MutableLiveData<List<SearchedUser>> getSearchedUsersMutableLiveData() {

        user.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                    mSearchedUser.add(dataSnapshot.getValue(SearchedUser.class));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.d("myDebug", "onCancelled: ");
            }
        });
        mSearchedUsersMutableLiveData.setValue(mSearchedUser);
        return mSearchedUsersMutableLiveData;
    }

А вот класс модели:

public class SearchedUser {

    private String mUserName;
    private String mUserEmail;
    private String mUserUid;

    public SearchedUser() {
    }

    public String getUserName() {
        return mUserName;
    }

    public void setUserName(String mUserName) {
        this.mUserName = mUserName;
    }

    public String getUserEmail() {
        return mUserEmail;
    }

    public void setUserEmail(String mUserEmail) {
        this.mUserEmail = mUserEmail;
    }

    public String getUserUid() {
        return mUserUid;
    }

    public void setUserUid(String mUserUid) {
        this.mUserUid = mUserUid;
    }
}

Когда я отлаживаю метод dataSnapshot.getValue(SearchedUser.class), все значения в этом классе равны нулю.

Но когда я отлаживаю метод dataSnapshot.getChildren(), я получаю DataSnapshot { key = I7XA6J7uNseaPfWQxcraiTi3CZq1, value = {UserDetails={userEmail=admin@eag.com, userName=Misha}} }.

и dataSnapshot.getChildrenCount(), извлекая количество пользователей.

Кто-нибудь может объяснить мне, что мне делать?

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Хай Майкл, весь метод firebase асинхронен, поэтому, пока в этом методе

public MutableLiveData<List<SearchedUser>> getSearchedUsersMutableLiveData() {

        user.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                    mSearchedUser.add(dataSnapshot.getValue(SearchedUser.class));
                }
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                Log.d("myDebug", "onCancelled: ");
            }
        });
        mSearchedUsersMutableLiveData.setValue(mSearchedUser);
        return mSearchedUsersMutableLiveData;
    }

вы сначала возвращаете значение, а ваш метод firebase все еще получает значение из базы данных, в результате он всегда будет null.

По моему мнению, вы должны установить свой адаптер внутри метода onDataChange за пределами l oop, и он всегда будет извлекать данные и заполнять ваш список.

0 голосов
/ 10 июля 2020

В вашем коде есть две основные проблемы.

  1. Когда вы используете ссылку user, которая определяется как:

    private DatabaseReference user = db.getReference("Users");
    

И прикрепите к нему слушателя, при циклическом прохождении объекта snapshot с помощью метода getChildren () вы не получаете объекты SearchedUser, как вы ожидали, и это потому, что прямой дочерний элемент dataSnapshot является дочерним элементом введите String с именем UserDetails, а не объект SearchedUser. Чтобы получить эти SearchedUser объекты, необходим вызов .child("UserDetails"), как показано в следующих строках кода:

user.addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        for (DataSnapshot dataSnapshot : snapshot.getChildren()){
            mSearchedUser.add(dataSnapshot.child("UserDetails").getValue(SearchedUser.class));
//                                        ^^^^^^^^^^^^^^^^^^^^^
        }
    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
        Log.d("myDebug", "onCancelled: ");
    }
});
Чтобы иметь возможность получить эти объекты SearchedUser, имя свойств в вашем классе должно совпадать с именем свойств в базе данных. Видите ли, у вас есть поле с именем mUserEmail в вашем классе SearchedUser, а в базе данных - userEmail, и это не правильно. Чтобы решить эту проблему, вы можете просто изменить имя всех свойств в своем классе, чтобы оно соответствовало имени в базе данных.

Также не забудьте переместить следующую строку кода:

mSearchedUsersMutableLiveData.setValue(mSearchedUser);

Сразу после окончания цикла for:

for (DataSnapshot dataSnapshot : snapshot.getChildren()){
    mSearchedUser.add(dataSnapshot.getValue(SearchedUser.class));
}
mSearchedUsersMutableLiveData.setValue(mSearchedUser);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...