【问题标题】:java.lang.String cannot be cast to java.util.HashMap Errorjava.lang.String 无法转换为 java.util.HashMap 错误
【发布时间】:2017-03-06 12:07:14
【问题描述】:

我有以下代码试图检索 firebase 值。我的数据库结构如下:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mystatement);
    listview = (ListView) findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    listview.setAdapter(adapter);
    dref = FirebaseDatabase.getInstance().getReference();
    dref = dref.child("Dog Expenditure");

    dref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()) {
                HashMap<String, Object> value = (HashMap<String, Object>) child.getValue();
                String amount = value.get("amount").toString();
                String item = value.get("item").toString();
                // This will print out amount and item
                System.out.println(amount + item);
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

我尝试了不同的方法来做到这一点,但我在这里没有运气。我得到的只是这个错误 java.lang.ClassCastException:java.lang.String 不能转换为 java.util。哈希映射 在 com.example.moses.farm.Mystatement$1.onDataChange(Mystatement.java:39) 指向这 HashMap value = (HashMap) child.getValue(); 行代码.我在这里被困了将近一个星期,任何知道如何获得它的人都会真正帮助我

【问题讨论】:

  • 可能是您的孩子返回String请检查...
  • 不确定这是否会解决它,但您绝对不应该强制转换为 HashMap。而是投:Map&lt;String, Object&gt; value = (Map&lt;String, Object&gt;) child.getValue()

标签: android firebase firebase-realtime-database


【解决方案1】:
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_mystatement);
    listview = (ListView) findViewById(R.id.listview);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_dropdown_item_1line, list);
    listview.setAdapter(adapter);
    dref = FirebaseDatabase.getInstance().getReference();
    dref = dref.child("Dog Expenditure");

    dref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot child : dataSnapshot.getChildren()) {
                String amount = child.get("amount").toString();
                String item = value.get("item").toString();
                // This will print out amount and item
                System.out.println(amount + item);
            }
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
        }
    });
}

使用此代码

【讨论】:

  • java.lang.ClassCastException: java.lang.String 无法转换为 java.util.HashMap
  • 我注意到了一些非常奇怪的事情..在我的 android studio 控制台((监视器)中,我看到了我手动添加的 firebase 条目的值..即我的结构就像这样 Dog Expenditure ---KeT_eEhkkiKJYOo1hb5 -- amount: "12'000" --item: "gsgag" 然后我手动添加了一个名为 amount: "xxxx" 的子项仍在 Dog Expenditure 下,但现在没有这个唯一标识符 "KeT_eEhkkiKJYOo1hb5"。控制台打印出 xxxx。但不是具有唯一标识符的原始值
  • 好吧,这意味着至少你能够解决类型转换错误吧?
【解决方案2】:
HashMap<String, Object> value = child.getValue();

试试这个

【讨论】:

  • @ManfredRadlwimmer java.lang.ClassCastException: java.lang.String 无法转换为 java.util.HashMap
  • @SirGeorge 我没有写答案,karthi 写了。我只是删除了 in-bowser 剪切标记 - 对此无能为力。
  • 将对象替换为字符串
  • @karthi java.lang.ClassCastException: java.lang.String 无法转换为 java.util.HashMap
  • HashMap value = (HashMap) child.getValue();
【解决方案3】:
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) {
    }
});

【讨论】:

  • 请将您的检索代码发送给我,以便我可以在我的应用程序中试用。我被困在这里
【解决方案4】:

正确的做法是先创建一个数据模型:

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

    }
});

【讨论】:

  • 嘿 java.lang.ClassCastException: java.lang.String 无法转换为 java.util.HashMap 错误
【解决方案5】:

改变这一行 value.get("amount").toString();

String.valueOf(value.get("amount")); 它解决了我的问题。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2021-12-14
  • 1970-01-01
  • 2018-05-17
  • 2020-08-13
  • 2014-02-11
  • 1970-01-01
  • 2012-03-31
相关资源
最近更新 更多