2016-07-01 51 views
-2

我試圖從Firebase獲取一些數據,但得到這個錯誤:java.lang.ClassCastException: java.lang.String cannot be cast to java.util.Map同時試圖這樣做。獲取'java.lang.ClassCastException:java.lang.String不能轉換爲java.util.Map'而試圖從firebase中獲取數據

這是我正在嘗試;

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) { 

       } 
      }); 
     } 

這是怎麼回事?

請讓我知道。

+0

dataSnapshot.getValue()返回一個字符串,而不是地圖。您將它作爲地圖進行投射,但顯然它正在返回一個字符串 – basic

+0

@basic我已經在問題中提到過了。 –

+0

我假設這意味着'dataSnapshot.getValue()'的返回值是一個'String',並且您試圖將其轉換爲'Map '。仔細檢查您要放入數據庫的數據,以便將其輸入爲地圖。 – nukeforum

回答

0

具體類在getValue(返回的對象的)將是支持JSON類型之一:

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

該類由存儲在數據庫中的值的格式(或其他嵌入類型信息)確定。

在你的情況下,存儲的值是String。它不能投射到Map

使用Firebase控制檯查看作爲uid的子項存儲的值,以確認它們是您所期望的。也許你不打算存儲字符串,但那是什麼。

更新

而不是你需要使用一個ValueEventListener一個ChildEventListener。如果我正確理解您的數據庫結構,uid有子女requestsAcceptedrequestsPosted。使用ChildEventListener時,回調將在任何一個更改時觸發,並將返回已更改子級的簡單字符串值。您的回撥代碼預計爲uid的所有子女的地圖。您可以通過uid上的ValueEventListener獲得此信息。

你也可以繼續使用ChildEventListener,但參考是一個級別:

databaseReferenceUsers.addChildEventListener(...) 
+0

那我該如何檢索數據呢? –

+0

我有字符串存儲在那裏,並希望檢索它們 –

+0

您的代碼期望每個孩子都是一個字符串的地圖,但這不是你存儲的。看看存儲「uid」子元素值的代碼。什麼是你正在存儲的對象的類?發佈代碼。 –

相關問題