我应该如何从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;
}
}
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;
}
}
答案 0 :(得分:0)
解决方案
在此示例中,由于使用了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,则上述接口方法仅调用一次。