Firebase数据库获取所有孩子

Firebase数据库获取所有孩子

问题描述:

我想从我的数据库中获取所有孩子。我尝试了几乎类似于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) 

凡可能是一个问题吗?谢谢。

变化

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

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

谢谢,但仍然是相同的错误。 – Samo

使用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

据我所知,DataSnapshot会给你一个array不是object。那么也许你可以尝试这样的事情:

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