作者:docetaxel | 来源:互联网 | 2023-02-11 18:14
我刚刚进入了Firebase和android的世界。我遵循在线教程来设置和获取非嵌套数据,并将其显示在列表视图中,如下所示:
之前的数据:
mListView = (ListView) findViewById(R.id.ListView) ;
final ArrayAdapter arrayAdapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, mStudents);
mListView.setAdapter(arrayAdapter);
FirebaseDatabase database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Student1");
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
String value = dataSnapshot.getValue(String.class);
String key = dataSnapshot.getKey();
String totl = key + ": " + value;
mStudents.add(totl);
arrayAdapter.notifyDataSetChanged();
}
});
我向数据库添加了带有子字段的成绩字段。我想显示整个学生1数据以及成绩。当我尝试运行上面的代码时。我收到以下错误。
数据后:
FATAL EXCEPTION: main
Process: com.adcpnmd.mystudents, PID: 3524
com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
at com.google.android.gms.internal.zzbqi.zzaD(Unknown Source)
at com.google.android.gms.internal.zzbqi.zzb(Unknown Source)
at com.google.android.gms.internal.zzbqi.zza(Unknown Source)
at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
at com.adcpnmd.mystudents.Main$1.onChildAdded(Main.java:39)
at com.google.android.gms.internal.zzblz.zza(Unknown Source)
at com.google.android.gms.internal.zzbnz.zzYj(Unknown Source)
at com.google.android.gms.internal.zzboc$1.run(Unknown Source)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
访问全部数据并将其添加到ListView时应该怎么做?还是我构造的数据不正确?
提前致谢。
1> Valentino S...:
尝试像这样更改您的firebase代码:
myRef = database.getReference().child("Student1").child("Grades");
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
if (dataSnapshot.exists()) {
String value = dataSnapshot.getValue(String.class);
String key = dataSnapshot.getKey();
String totl = key + ": " + value;
mStudents.add(totl);
arrayAdapter.notifyDataSetChanged();
}
}
});
更新资料
要访问整个节点Student1
,您可以这样做:
首先,我将您的Class
字段重命名为Course
,因为这Class
可能会引起混乱和问题(Android本身会使用它)。因此Student.java
,请使用代表您数据的普通对象创建一个Java文件:
public class Student {
private String Course;
private String Name;
private String Percentile;
private HashMap Grades;
public Student() {
}
public Student(String course, String name, String percentile, HashMap grades) {
Course = course;
Name = name;
Percentile = percentile;
Grades = grades;
}
public String getCourse() {
return Course;
}
public String getName() {
return Name;
}
public String getPercentile() {
return Percentile;
}
public HashMap getGrades() {
return Grades;
}
}
接下来,通过以下方式获取数据:
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
Student student = dataSnapshot.getValue(Student.class);
Log.d("TAG","name: "+student.getName());
Log.d("TAG","percentile: "+student.getPercentile());
Iterator it = student.getGrades().entrySet().iterator();
while (it.hasNext()) {
Map.Entry pair = (Map.Entry)it.next();
Log.d("TAG","grade: "+pair.getKey() + " = " + pair.getValue());
it.remove(); // avoids a ConcurrentModificationException
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
myRef = database.getReference().child("Student1");
myRef.addListenerForSingleValueEvent(valueEventListener);