Firebase数据库获取所有孩子
问题描述:
我想从我的数据库中获取所有孩子。我尝试了几乎类似于Google Developers发布的YouTube上类似的代码,但之后进行了更改。我只想获取下面的userdata的所有信息(有用户的配置文件)。 我的数据库看起来像: Firebase数据库获取所有孩子
,我想那是在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);
答
使用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);
}
}
答
据我所知,DataSnapshot
会给你一个array
不是object
。那么也许你可以尝试这样的事情:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot snapshot : dataSnapshot.getChildren()){
YourObject obj = snapshot.getValue(YourObject.class);
}
}
谢谢,但仍然是相同的错误。 – Samo