2016-08-16 139 views
0

我想從我的數據庫中獲取所有孩子。我嘗試了幾乎類似於Google Developers發佈的YouTube上類似的代碼,但之後進行了更改。我只想獲取下面的userdata的所有信息(有用戶的配置文件)。 我的數據庫看起來像: tree representation of dataFirebase數據庫獲取所有孩子

,我想那是在userdata 所有信息這裏是我的代碼。

FirebaseDatabase database5 = FirebaseDatabase.getInstance(); 
    DatabaseReference myRef5 = database5.getReference("userdata"); 

    myRef5.addValueEventListener(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      // This method is called once with the initial value and again 
      // whenever data at this location is updated. 
      Map<String, String> map = dataSnapshot.getValue(Map.class); 
      map.getClass(); 
      Log.i("Mufz", "Value is: " + map.getClass()); 


//    Toast.makeText(getApplicationContext(), `value3.toString(), Toast.LENGTH_SHORT).show();` 

     } 

     @Override 
     public void onCancelled(DatabaseError error) { 
      // Failed to read value 
      Log.w("TAG", "Failed to read value.", error.toException()); 
//    Toast.makeText(getApplicationContext(), error.toException().toString(), Toast.LENGTH_SHORT).show(); 
     } 

    }); 

運行這個沒有什麼後會發生,它運行prevoroius活動或有錯誤來

08-16 19:29:47.225 32507-32507/com.samo.facedatefb E/AndroidRuntime: FATAL EXCEPTION: main 
                   Process: com.samo.facedatefb, PID: 32507 
                   com.google.firebase.database.DatabaseException: Class java.util.Map has generic type parameters, please use GenericTypeIndicator instead 
                    at com.google.android.gms.internal.zzaln.zzb(Unknown Source) 
                    at com.google.android.gms.internal.zzaln.zza(Unknown Source) 
                    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source) 
                    at com.samo.facedatefb.MapsActivity$3.onDataChange(MapsActivity.java:306) 
                    at com.google.android.gms.internal.zzaie.zza(Unknown Source) 
                    at com.google.android.gms.internal.zzaje.zzcta(Unknown Source) 
                    at com.google.android.gms.internal.zzajh$1.run(Unknown Source) 
                    at android.os.Handler.handleCallback(Handler.java:815) 
                    at android.os.Handler.dispatchMessage(Handler.java:104) 
                    at android.os.Looper.loop(Looper.java:194) 
                    at android.app.ActivityThread.main(ActivityThread.java:5549) 
                    at java.lang.reflect.Method.invoke(Native Method) 
                    at java.lang.reflect.Method.invoke(Method.java:372) 
                    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:964) 
                    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:759) 

凡可能是一個問題嗎?謝謝。

回答

0

變化

Map<String, String> map = dataSnapshot.getValue(Map.class); 

Map<String, Object> map = dataSnapshot.getValue(Map.class); 
+0

謝謝,但仍然是相同的錯誤。 – Samo

0

使用GenericTypeIndicator類元帥的數據。 按照文檔:

由於Java實現泛型(類型擦除)的方式,它是需要使用稍微複雜一點的方法 正確 決心類型在運行時泛型集合。

取而代之的是:

Map<String, String> map = dataSnapshot.getValue(Map.class); 

使用GenericTypeIndicator:

@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    // This method is called once with the initial value and again 
    // whenever data at this location is updated. 
    for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
     GenericTypeIndicator<Map<String, Object>> m = new GenericTypeIndicator<Map<String, Object>>(){}; 
     Map<String, Object> map = snapshot.getValue(m); 
     long age = (long)map.getValue("age"); 

     Log.i("Mufz", "User Data Value is: " + snapshot.getKey()); 
     Log.i("Mufz", "User Name Value is: " + map.getValue("username")); 
     Log.i("Mufz", "User Age Value is: " + age); 
    } 
} 
+0

謝謝,但我曾嘗試過和以前一樣。一段時間後,它啓動MainActivity,像重新啓動的應用程序。或者當我調試應用程序時,發現我發佈的simillar錯誤:/ – Samo

+0

我的錯,我忽略了您使用的引用。如果你想添加一個監聽器到你的「userdata」節點,那麼你將需要遍歷每個子節點。我會編輯我的答案。 –

+0

非常感謝你的男人是如此有幫助,它的工作:) 如果你可以只是一件事。正如你所看到的,我也有所有「用戶配置文件」的年齡。所以它向我拋出的錯誤,龍無法轉換爲字符串,所以我不得不刪除這個領域,一切工作完美。但是如何讓所有領域都包括年齡?謝謝 – Samo

0

據我所知,DataSnapshot會給你一個array不是object。那麼也許你可以嘗試這樣的事情:

@Override 
public void onDataChange(DataSnapshot dataSnapshot) { 
    for(DataSnapshot snapshot : dataSnapshot.getChildren()){ 
     YourObject obj = snapshot.getValue(YourObject.class); 
    } 
} 
相關問題