尝试从firebase获取数据时,'java.lang.ClassCastException:java.lang.String无法转换为java.util.Map'

时间:2016-07-01 17:35:56

标签: java android firebase firebase-realtime-database classcastexception

我正在尝试从Firebase获取一些数据,但在尝试这样做时会收到此错误:java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map

这就是我正在尝试的;

    public void retrieveUserCounterAccepted() {
            databaseReferenceUsers = FirebaseDatabase.getInstance().getReferenceFromUrl("https://appname-e1a13.firebaseio.com/users/");
            databaseReferenceUsers.child(uid).addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    // error on the line below
                    newRequestAcceptedCounter = (Map<String, String>) dataSnapshot.getValue();
                    // error on line above
                    String requestAcceptedCounter = newRequestAcceptedCounter.get("requestsAccepted");
                    String requestsPostedCounter = newRequestAcceptedCounter.get("requestsPosted");
                    Menu menu = navigationView.getMenu();
                    MenuItem requests_posted = menu.findItem(R.id.requests_posted_counter);
                    requests_posted.setTitle(requestsPostedCounter);

                    MenuItem requests_accepted = menu.findItem(R.id.requests_accepted_counter);
                    requests_accepted.setTitle(requestAcceptedCounter);
                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                    newRequestAcceptedCounter = (Map<String, String>) dataSnapshot.getValue();
                    String requestAcceptedCounter = newRequestAcceptedCounter.get("requestsAccepted");
                    String requestsPostedCounter = newRequestAcceptedCounter.get("requestsPosted");
                    Menu menu = navigationView.getMenu();
                    MenuItem requests_posted = menu.findItem(R.id.requests_posted_counter);
                    requests_posted.setTitle(requestsPostedCounter);

                    MenuItem requests_accepted = menu.findItem(R.id.requests_accepted_counter);
                    requests_accepted.setTitle(requestAcceptedCounter);
                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {

                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });
        }

这里出了什么问题?

请告诉我。

1 个答案:

答案 0 :(得分:0)

getValue()返回的对象的特定类将是受支持的JSON类型之一:

  • Boolean
  • String
  • Long
  • Double
  • Map<String, Object>
  • List<Object>

该类由存储在数据库中的值的格式(或其他嵌入类型信息)确定。

在您的情况下,存储的值为String。它无法转换为Map

使用Firebase控制台查看存储为uid子项的值,以确认它们是您所期望的。也许你不打算存储字符串,但那就是存在的字符串。

<强>更新

而不是ChildEventListener,您需要使用ValueEventListener。如果我正确理解您的数据库结构,uid有子requestsAcceptedrequestsPosted。使用ChildEventListener时,回调将在其中任何一个发生更改时触发,并将返回已更改子项的简单字符串值。您的回调代码期望uid的所有子项的地图。您可以使用ValueEventListener上的uid来获取此内容。

你也可以继续使用ChildEventListener,但是在一个级别的引用上:

databaseReferenceUsers.addChildEventListener(...)