无法将java.util.HashMap类型的值转换为String

时间:2017-11-28 15:37:40

标签: java android firebase firebase-realtime-database

我不知道如何在logcat上呈现这个JSON:enter image description here

从firebase实时数据库获取数据的源代码:

FirebaseDatabase database = FirebaseDatabase.getInstance();
DatabaseReference myRef = database.getReference("hotel");

myRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        String value = dataSnapshot.getValue(String.class);
        Log.d(TAG, "Value is: " + value);
    }

    @Override
    public void onCancelled(DatabaseError error) {
        Log.w(TAG, "Failed to read value.", error.toException());
    }
});

它说错误是这样的:

  

com.google.firebase.database.DatabaseException:无法将java.util.HashMap类型的值转换为String

我已经尝试了一些教程,但我找不到一个。另外,我试试这个:

HashMap value = DataSnapshot.getValue(HashMap.class);

它也结束了错误。我该如何渲染这个HashMap数据?

2 个答案:

答案 0 :(得分:9)

您将字符串 HashMap 作为键,将对象作为值,将其映射为如下所示。

myRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
             Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();
            Log.d(TAG, "Value is: " + value);
        }

        @Override
        public void onCancelled(DatabaseError error) {
            Log.w(TAG, "Failed to read value.", error.toException());
        }
    });

或者我们可以将其解析为某个模型而不是对象。

<强>更新 用它来解析

 Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();

答案 1 :(得分:1)

假设hotel节点是Firebase root的直接子节点,要获取这些值,请使用以下代码

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference hotelRef = rootRef.child("hotel");
ValueEventListener eventListener = new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(DataSnapshot ds : dataSnapshot.getChildren()) {
            String address = ds.child("address").getValue(String.class);
            String name = ds.child("name").getValue(String.class);
            Log.d("TAG", address + " / " + name);
        }
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {}
};
hotelRef.addListenerForSingleValueEvent(eventListener);

输出将是:

Surubaya / Hotel Suridan
Bandung / Hotel Santika
//and so on