我正在尝试从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) {
}
});
}
这里出了什么问题?
请告诉我。
答案 0 :(得分:0)
getValue()返回的对象的特定类将是受支持的JSON类型之一:
Boolean
String
Long
Double
Map<String, Object>
List<Object>
该类由存储在数据库中的值的格式(或其他嵌入类型信息)确定。
在您的情况下,存储的值为String
。它无法转换为Map
。
使用Firebase控制台查看存储为uid
子项的值,以确认它们是您所期望的。也许你不打算存储字符串,但那就是存在的字符串。
<强>更新强>
而不是ChildEventListener
,您需要使用ValueEventListener
。如果我正确理解您的数据库结构,uid
有子requestsAccepted
和requestsPosted
。使用ChildEventListener
时,回调将在其中任何一个发生更改时触发,并将返回已更改子项的简单字符串值。您的回调代码期望uid
的所有子项的地图。您可以使用ValueEventListener
上的uid
来获取此内容。
你也可以继续使用ChildEventListener
,但是在一个级别的引用上:
databaseReferenceUsers.addChildEventListener(...)