Объект не получает из Datasnapshot с использованием valueEventListerner, но работает find, но AddChildEventListern - PullRequest
0 голосов
/ 22 октября 2019

Когда я пытаюсь получить объект из addChildListerner (DataSnapShot), он работает нормально и присваивает объекту DataSnapshot

Это работает нормально:

  myRef = database.getReference("Chat").child(Combine);
    myRef.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ChatData user = dataSnapshot.getValue(ChatData.class);
            userChild.add(user);

Но когда я пытаюсь получить то же самоеПри использовании объекта ValueListerner (снимок) происходит сбой приложения. Я использую все snapshot.getChildern () snapshot.getValue, затем происходит сбой приложения.

Ошибка при

myRef = database.getReference("Chat").child(Combine);
myRef.orderByKey().limitToLast(1).addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                        ChatData user = dataSnapshot.getValue(ChatData.class);
                        userChild.add(user);

                }

Я хочу получить ChatData user = dataSnapshot.getValue (ChatData.class);userChild.add (пользователь);

Debug time : 

         DataSnapshot { key = 
                     1123469ACDEFFFFGJKLNOOOPQSTUUVWZabccdehhkkloopqruuuuwxyy, 
                     value
                           = {-LrjsM3ZO0pzQbvCcRuQ
                           ={time=Tue Oct 22 00:53:10 GMT+05:00 2019
                           , msg=hi
                            , user_ID=LuFro93OCcPEpoFTKuQhUkeuw462}} 
                              }


Как получить это значение

Database Image

1 Ответ

0 голосов
/ 22 октября 2019

Когда вы выполняете запрос к базе данных Firebase, потенциально может быть несколько результатов. Таким образом, снимок содержит список этих результатов. Даже если есть только один результат, снимок будет содержать список из одного результата.

В первом примере клиент Firebase обрабатывает список и вызывает ваш onChildAdded для каждого результата. Но с ValueEventListener вы получите один снимок со всеми результатами. Таким образом, ваш onDataChange должен будет обработать этот список, что вы делаете, перебирая DataSnapshot.getChildren().

Примерно так:

myRef.orderByKey().limitToLast(1).addListenerForSingleValueEvent(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
        for (DataSnapshot userSnapshot: dataSnapshot.getChildren()) {
            ChatData user = userSnapshot.getValue(ChatData.class);
            userChild.add(user);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...