【问题标题】:Having ClassCastException when retrieving data from firebase从 firebase 检索数据时出现 ClassCastException
【发布时间】:2015-07-13 17:24:19
【问题描述】:

我正在制作一个使用 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) {

                    }
                });

这是一个日志猫

Process: com.firebasedemo, PID: 10509
    java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map
            at com.firebasedemo.MainActivity$1$2.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$1.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)

【问题讨论】:

  • dataSnapshot.getValue();不能投地图!改用它 Map newPost = new HashMap(dataSnapshot.getValue());和 dataSnapshot.getValue();返回地图对吗?
  • 异常表明您得到的不是Map&lt;String,Object&gt;。您能否发布您正在提取的数据的 JSON System.out.println(dataSnapshot.getValue().getClass())
  • 感谢@MicheleLacorte,当我将 Map 更改为 HashMap 时,它工作正常

标签: java android firebase


【解决方案1】:

我建议不要在代码的这个阶段反序列化 Map&lt;String, Object&gt;DataSnapshot 类具有遍历数据结构的方法,如果它们失败将导致更好的错误消息:

@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());
}

最好还是创建一个代表数据的类并使用 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();
}

请注意,在最后一个示例中,您需要将属性存储为firstNamelastName,以便它们与字段名称匹配。有一些方法可以控制它,但我从不打扰,只是确保我的 JSON 与我的字段名称匹配。

【讨论】:

    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多