2017-02-15 110 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