从 firebase 检索数据时出现 ClassCastException
Having ClassCastException when retrieving data from firebase
我正在制作一个使用 Firebase 实时数据库的 android 应用程序,当我检索数据时出现 ClassCastException: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
这是我的Java代码
mref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map<String, Object> newPost = (Map<String, Object>) dataSnapshot.getValue();
System.out.println("First Name: " + newPost.get("FirstName"));
System.out.println("Last Name: " + newPost.get("LastName"));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
这是一个logcat
Process: com.firebasedemo, PID: 10509
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
at com.firebasedemo.MainActivity.onChildAdded(MainActivity.java:75)
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
我建议不要在代码的这个阶段反序列化 Map<String, Object>
。 DataSnapshot
class 有遍历数据结构的方法,如果失败会导致更好的错误消息:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("First Name: " + dataSnapshot.child("FirstName").getValue());
System.out.println("Last Name: " + dataSnapshot.child("LastName").getValue());
}
更好的方法是创建一个 class 来表示数据并使用 Firebase 的内置 JavaBeans 模式处理:
public class Name {
String firstName;
String lastName;
public String getFirstName() {
return firstName();
}
public String getLastName() {
return lastName();
}
}
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Name name = dataSnapshot.getValue(Name.class);
System.out.println("First Name: " + name.getFirstName());
System.out.println("Last Name: " +name.getLastName();
}
请注意,在最后一个示例中,您需要将属性存储为 firstName
和 lastName
,以便它们与字段名称相匹配。有一些方法可以控制它,但我从不费心,只是确保我的 JSON 与我的字段名称匹配。
我正在制作一个使用 Firebase 实时数据库的 android 应用程序,当我检索数据时出现 ClassCastException: java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
这是我的Java代码
mref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Map<String, Object> newPost = (Map<String, Object>) dataSnapshot.getValue();
System.out.println("First Name: " + newPost.get("FirstName"));
System.out.println("Last Name: " + newPost.get("LastName"));
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
这是一个logcat
Process: com.firebasedemo, PID: 10509
java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
at com.firebasedemo.MainActivity.onChildAdded(MainActivity.java:75)
at com.firebase.client.core.ChildEventRegistration.fireEvent(ChildEventRegistration.java:48)
at com.firebase.client.core.view.DataEvent.fire(DataEvent.java:45)
at com.firebase.client.core.view.EventRaiser.run(EventRaiser.java:38)
at android.os.Handler.handleCallback(Handler.java:733)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5001)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
at dalvik.system.NativeStart.main(Native Method)
我建议不要在代码的这个阶段反序列化 Map<String, Object>
。 DataSnapshot
class 有遍历数据结构的方法,如果失败会导致更好的错误消息:
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
System.out.println("First Name: " + dataSnapshot.child("FirstName").getValue());
System.out.println("Last Name: " + dataSnapshot.child("LastName").getValue());
}
更好的方法是创建一个 class 来表示数据并使用 Firebase 的内置 JavaBeans 模式处理:
public class Name {
String firstName;
String lastName;
public String getFirstName() {
return firstName();
}
public String getLastName() {
return lastName();
}
}
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Name name = dataSnapshot.getValue(Name.class);
System.out.println("First Name: " + name.getFirstName());
System.out.println("Last Name: " +name.getLastName();
}
请注意,在最后一个示例中,您需要将属性存储为 firstName
和 lastName
,以便它们与字段名称相匹配。有一些方法可以控制它,但我从不费心,只是确保我的 JSON 与我的字段名称匹配。