FirebaseDatabaseException:反序列化时需要一个列表,但有一个类 java.util.HashMap
Posted
技术标签:
【中文标题】FirebaseDatabaseException:反序列化时需要一个列表,但有一个类 java.util.HashMap【英文标题】:FirebaseDatabaseException: Expected a List while deserializing, but got a class java.util.HashMap 【发布时间】:2020-04-04 06:27:06 【问题描述】:我应该如何从 firebase 读取这些数据? 因为这是一个严重的问题,让我简单地解释一下这个问题。 因此,就像在下面的 json 图像中一样,我有一个需要检索的数据 max_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 中插入一些初始值来解决这个问题。这样每当我检索它收到的值时,因为现在它有一个列表但有一些初始值。我想告诉你一些细节。请在我编辑后查看。
【参考方案1】:
解决方案
在这个例子中,我使用了接口,因为我已经在一个 Java 类中分离了所有与数据库相关的方法。
lessonProgressList = new ArrayList<>();
mDatabaseReference = firebaseDatabase.getReference("clas-s-room/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存在的情况下才调用一次。
【讨论】:
以上是关于FirebaseDatabaseException:反序列化时需要一个列表,但有一个类 java.util.HashMap的主要内容,如果未能解决你的问题,请参考以下文章