2017-02-15 111 views
0

我刚刚进入了firebase和android的世界。我跟着网上教程设置和获取非嵌套数据并显示那些在ListView如下:检索Firebase中的嵌套数据 - Android

之前的数据:

Before Data

mListView = (ListView) findViewById(R.id.ListView) ; 
    final ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(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(); 
     } 
    }); 

我加了一个等级场分田数据库。我想显示整个student1数据以及成绩。当我尝试运行上面的代码。我收到以下错误。

数据后:

After Data

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吗?还是我错误地构造数据?

在此先感谢。

+0

查询这里http://stackoverflow.com/ questions/26700924/query-based-multiple-where-clause-in-firebase?noredirect = 1&lq = 1 – Alexander

回答

2

试图改变自己的火力点这样的代码:

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本身使用)。因此,创建一个Java文件Student.java与代表你的数据平原对象:

public class Student { 

    private String Course; 
    private String Name; 
    private String Percentile; 
    private HashMap<String,String> Grades; 

    public Student() { 

    } 

    public Student(String course, String name, String percentile, HashMap<String, String> 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<String, String> 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); 
+0

这只允许我访问成绩字段内的数据。我想访问整个Student1数据以供显示。名字,班级,百分位以及等级。我怎样才能做到这一点? – Xnkr

+0

看我**更新**,这应该工作 –

+0

addListenerForSingleValueEvent(valueEventListener)和addChildEventListener(childEventListener)有什么区别? – Xnkr