Ожидается список при десериализации, но есть класс java.util.HashMap - PullRequest
0 голосов
/ 15 апреля 2019

Я пытаюсь получить список пользователей из Firebase в Android.

enter image description here

У меня уже есть пользовательский uuid, и с его помощью я пытаюсь получить весь объект. Uuid - это и имя узла, и поле внутри пользовательского узла (конечно же, идентичные).

Вот мой код:

DatabaseReference usersRef = FirebaseDatabase.getInstance().getReference("users");
Query query = usersRef.orderByChild("uuid").equalTo(animalMarker.getUserUid());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            Log.d(TAG, "onDataChange: xxxxxxxx---- entered onDataChange");

            // go to node "users/userUID" , becuase dataSnapshot is parent node
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                Log.d(TAG, "xxxxxxxx---- onDataChange: ds= " + ds);
                User user = ds.getValue(User.class);
                Log.d(TAG, "xxxxxxxx---- onDataChange: user=" + user);
                // createdByTV.setText("Created by \n" + user.getEmail());
            }

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

Я не знаю, происходит ли ошибка «ожидаемый список, но получил HashMap» из всего самого DataSnapshot или из списка животных внутри пользователя (в классе пользователя есть поле «Список животных»)

Я уже проверил этот похожий вопрос Andorid-Expect a List при десериализации, но получил класс java.util.HashMap и несколько других, но я все еще не могу понять, что не так.

РЕДАКТИРОВАТЬ: я пытаюсь получить электронную почту пользователя, зная, что это идентификатор (uuid). Хотя получение всего объекта User не является необходимым, меня интересует, как это будет сделано, поскольку я не могу выполнить ни одно из этих действий.

РЕДАКТИРОВАТЬ: вот мой класс пользователя

public class User {

private String uuid;
private String email;
private String name;
private List<User> friends;
private List<Animal> animals;

public User() {
}

public User(String email, String name) {
    this.email = email;
    this.name = name;
}

public User(String uuid, String email, String name) {
    this.uuid = uuid;
    this.email = email;
    this.name = name;
}
... // getters and setters, toString and other such
}

При попытке получить пользователя, у которого нет узла животных внутри, все работает нормально. но при попытке получить пользователя с узлом животных, приложение вылетает.

Ответы [ 2 ]

3 голосов
/ 16 апреля 2019

На самом деле я ответил на этот вопрос, но в этом случае проблема немного другая. Итак, вы получаете следующую ошибку:

ожидаемый список, но получил HashMap

Поскольку ваш animals узел, который существует в каждом пользовательском объекте, является , а не , список объектов животных на самом деле является картой объектов животных, и именно поэтому эта ошибка.

Хотя получение всего объекта User не является необходимым, меня интересует, как это будет сделано, поскольку мне не удается выполнить ни одно из этих действий.

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

String email = ds.child("email").getValue(String.class);

Теперь, чтобы сопоставить объект DataSnapshot с User и получить список объектов животных от определенного пользователя, удалите:

//private List<User> friends;
//private List<Animal> animals;

И используйте следующие строки кода:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference animalsRef = rootRef.child("users").child(uid).child("animals");
ValueEventListener valueEventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        List<Animal> animalList = new ArrayList<>();
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            Animal animal = ds.getValue(Animal.class);
            animalList.add(animal);
        }

        //Do what you need to do with the animalList
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {
        Log.d(TAG, databaseError.getMessage()); //Don't ignore errors!
    }
};
animalsRef.addListenerForSingleValueEvent(valueEventListener);
0 голосов
/ 15 апреля 2019

Список животных не находится внутри пользователя, он находится внутри узла пользователей.В любом случае создание объекта внутри объекта пользователя кажется более вложенным, чем необходимо.У вас должен быть другой узел для животных

user_animals:{
    uid:{key1:{}, key2:{}
}

Ваша проблема сейчас в том, что вы делаете запрос вместо получения значения узла

usersRef.child(uid).addSingleEvent..

...onDataChange...
User user = datasnapshot.getValue(User.class);

Вам необходимо создать класс User, который отражаетатрибуты ваших пользователей в RTD

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