【问题标题】:FirebaseDatabaseException: Expected a List while deserializing, but got a class java.util.HashMapFirebaseDatabaseException:反序列化时需要一个列表,但有一个类 java.util.HashMap
【发布时间】:2020-04-04 06:27:06
【问题描述】:

我应该如何从 firebase 读取这些数据? 因为这是一个严重的问题,让我简单地解释一下这个问题。 因此,就像在下面的 json 图像中一样,我有一个需要检索的数据 ma​​x_slide,但由于下面的 Exception 而我不能。

com.google.firebase.database.DatabaseException:反序列化时需要一个列表,但得到一个类 java.util.HashMap

显示此异常是因为 JSON 中目前没有列表。但是当我在那里添加一些数据以制作列表时,它是 JSON 格式的。没有这样的例外。

只有一个数据存在时才会出现异常!

下面的代码,我用来检索数据。错在哪里?

        lessonProgressList = new ArrayList<>();
        mDatabaseReference = firebaseDatabase.getReference("/lesson");
        mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists() && dataSnapshot.getValue() != null) {

                    for (DataSnapshot ds: dataSnapshot.getChildren()) {
                        Log.d(TAG, "DataSnapshot Loop");
                        Lesson lesson = ds.getValue(Lesson.class);     // THIS LINE THROWING THE EXCEPTION
                        lessonProgressList.add(lesson);
                    }

                    listener.updateLessonsProgress(lessonProgressList);
                    Log.d(TAG, "DataSnapshot Success");

                } else {
                    Log.d(TAG, "Failed!");
                }
            }
            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) { }
        });

Lesson.java 类

public class Lesson implements Serializable{

    private List<Topic> topic;

    public Lesson() {
    }

    public Lesson(List<Topic> topic) {
        this.topic = topic;
    }

    public List<Topic> getTopic() {
        return topic;
    }
}

主题.java

public class Topic implements Serializable {
    private int max_slide;

    public Topic(int max_slide) { this.max_slide = max_slide; }

    public Topic() { }

    public int getMax_slide() {
        return max_slide;
    }
}

【问题讨论】:

  • 你的Lesson 班级是什么样子的?
  • 请帮助我添加了 Lesson.java 类。
  • 嗯...我没有立即看到问题。希望其他人发现它。
  • 谢谢#Frank van。我通过在 Firebase DB 中插入一些初始值来解决这个问题。这样每当我检索它收到的值时,因为现在它有一个列表但有一些初始值。我想告诉你一些细节。请在我编辑后查看。

标签: java android json firebase firebase-realtime-database


【解决方案1】:

解决方案

在这个例子中,我使用了接口,因为我已经在一个 Java 类中分离了所有与数据库相关的方法。

lessonProgressList = new ArrayList<>();
        mDatabaseReference = firebaseDatabase.getReference("classroom/users/SubhojitHalderUid/lessons_progress/lesson");
        mDatabaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists() && dataSnapshot.getValue() != null) {

                    for (DataSnapshot ds: dataSnapshot.getChildren()) {
                        Log.d(TAG, "DataSnapshot Loop");
                        Log.d(TAG, "DataSnapshot Loop" );
                        Lesson lesson = ds.getValue(Lesson.class);
                        lessonProgressList.add(lesson);
                    }

                    listener.updateLessonsProgress(lessonProgressList);
                    Log.d(TAG, "DataSnapshot Lessons Progress Success");

                } else {
                    Log.d(TAG, "DataSnapshot Failed!");
                    //setup lesson progress ..          //  STEP 1
                    listener.setupLessonsProgress();    //  INVOKING AN INTERFACE METHODE TO WRITE SOME INISTIAL VALUE IN THE DB
                                                        //  IF dataSnapshot.exists() == false

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

            }
        });

Activity类中定义的接口方法

@Override
    public void setupLessonsProgress() {
        Log.d(TAG, "mLessonsList: " + mLessonsList.size());

        for (int x = 0; x < mLessonsList.size(); x++) {
            Log.d(TAG, "lessons " + x);
            for (int c = 0; c < mLessonsList.get(x).getTopics().size(); c++) {
                Log.d(TAG, "topic " + c);
                String writeTo = "lesson/"        // CONSTRUCTED DATABASE REF. PATH
                        + x
                        + "/topic/"
                        + c
                        +"/max_slide";
                database.writeData(writeTo, 0);  // PASSING REFERENCE PATH AND VALUE ZERO  
            }                                    // AS MY REQUIRED INITIAL VALUE
        }

        database.readLessonsProgress("");  // THEN RETRIEVE DATA FROM THE DATABASE
    }

下面是简单的写法

public void writeData(String path, int data) {
        Log.d(TAG, "path: " + path + "   data: " + data);
        mDatabaseReference = firebaseDatabase.getReference(path);
        mDatabaseReference.setValue(data);
    }

写完后看下面的JSON图片,就是我需要的。而且很酷的是,上面的接口方法只有在没有这样的dataSnapshot存在的情况下才调用一次。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-24
    • 2022-01-02
    • 1970-01-01
    • 2016-12-21
    • 2020-05-20
    • 1970-01-01
    相关资源
    最近更新 更多