Android 无法将java.lang.String转换为java.util.HashMap错误
我有以下代码试图检索firebase值。我的数据库结构如下:Android 无法将java.lang.String转换为java.util.HashMap错误,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我有以下代码试图检索firebase值。我的数据库结构如下: 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); setContentView(R.layout.activity\u mystatement); listview=(listview)findViewById(R.id.listview); adapter=new ArrayAdapter(这是android.R.layout.s
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mystatement);
listview=(listview)findViewById(R.id.listview);
adapter=new ArrayAdapter(这是android.R.layout.simple\u下拉列表\u项\u 1行,列表);
setAdapter(适配器);
dref=FirebaseDatabase.getInstance().getReference();
dref=dref.儿童(“狗儿支出”);
dref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot子项:DataSnapshot.getChildren()){
HashMap值=(HashMap)child.getValue();
字符串金额=value.get(“金额”).toString();
String item=value.get(“item”).toString();
//这将打印出金额和项目
系统输出打印项次(金额+项目);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
我尝试了不同的方法来实现这一点,但我在这里并没有得到任何运气。我得到的只是这个错误java.lang.ClassCastException:java.lang.String不能转换为java.util.HashMap 在com.example.moses.farm.Mystatement$1.onDataChange(Mystatement.java:39)上,它指向这个HashMap value=(HashMap)child.getValue()代码行。我已经在这里呆了将近一个星期了,任何知道如何得到它的人都会真正帮助我
DatabaseReference dref=FirebaseDatabase.getInstance().getReference();
DatabaseReference dref = FirebaseDatabase.getInstance().getReference();
dref = dref.child("Dog Expenditure");
dref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
HashMap<String, String> value = (HashMap<String, String>) dataSnapshot.getValue();
String amount = value.get("amount");
String item = value.get("item");
}
@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(DatabaseError databaseError) {
}
});
dref=dref.儿童(“狗儿支出”);
dref.addChildEventListener(新的ChildEventListener(){
@凌驾
公共void onChildAdded(DataSnapshot DataSnapshot,字符串s){
HashMap值=(HashMap)dataSnapshot.getValue();
字符串金额=value.get(“金额”);
字符串item=value.get(“item”);
}
@凌驾
公共void onChildChanged(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
ChildRemoved上的公共void(DataSnapshot DataSnapshot){
}
@凌驾
已移动ChildMoved上的公共void(DataSnapshot DataSnapshot,字符串s){
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u mystatement);
listview=(listview)findViewById(R.id.listview);
adapter=new ArrayAdapter(这是android.R.layout.simple\u下拉列表\u项\u 1行,列表);
setAdapter(适配器);
dref=FirebaseDatabase.getInstance().getReference();
dref=dref.儿童(“狗儿支出”);
dref.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
对于(DataSnapshot子项:DataSnapshot.getChildren()){
字符串amount=child.get(“amount”).toString();
String item=value.get(“item”).toString();
//这将打印出金额和项目
系统输出打印项次(金额+项目);
}
}
@凌驾
已取消的公共void(DatabaseError DatabaseError){
}
});
}
使用此代码正确的方法是首先创建数据模型:
public class DogExpenditure {
private String amount;
private String item;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
}
然后添加一个ChildEventListener:
dref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
DogExpenditure dogExpenditure = dataSnapshot.getValue(DogExpenditure.class);
System.out.println(dogExpenditure.getAmount()+dogExpenditure.getItem());
}
@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(DatabaseError databaseError) {
}
});
HashMap value=child.getValue();
试试这个更改此行的值。获取(“金额”).toString()
到
String.valueOf(value.get(“金额”);
它解决了我的问题。可能是您的孩子返回了
字符串
请检查它…不确定这是否能解决问题,但您绝对不应该强制转换为HashMap。而是强制转换:Map value=(Map)child.getValue()
@ManfredRadlwimmer java.lang.ClassCastException:java.lang.String不能强制转换为java.util。HashMap@SirGeorge我没有写答案,是卡蒂写的。我只是删除了in-bowser剪接标记-无法帮助您完成此操作。将对象替换为string@karthijava.lang.ClassCastException:java.lang.String不能强制转换为java.util.HashMapHashMap值=(HashMap)child.getValue();嘿,java.lang.ClassCastException:java.lang.String不能转换为java.util.HashMap errrorjava.lang.ClassCastException:java.lang.String不能转换为java.util.HashMapi注意到了一些非常奇怪的事情..在我的android studio控制台((监视器)我看到了我手动添加的firebase条目的值。也就是说,我的结构类似于这只狗的支出--KeT_Eehkkikjyo1HB5--金额:“12'000”--项目:“gsgag”,然后我手动添加了一个名为amount:“xxxx”的子项,仍然在狗的支出下,但现在没有唯一标识符“KeT_Eehkkikjyo1HB5”.控制台打印出xxxx。但不是具有唯一标识的原始值。这意味着至少您能够解决类型转换错误,对吗?请将检索代码发送给我,以便我可以在我的应用程序中尝试。我很荣幸在此
public class DogExpenditure {
private String amount;
private String item;
public String getAmount() {
return amount;
}
public void setAmount(String amount) {
this.amount = amount;
}
public String getItem() {
return item;
}
public void setItem(String item) {
this.item = item;
}
}
dref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
DogExpenditure dogExpenditure = dataSnapshot.getValue(DogExpenditure.class);
System.out.println(dogExpenditure.getAmount()+dogExpenditure.getItem());
}
@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(DatabaseError databaseError) {
}
});