Firebase Android无法将HashMap转换为String

时间:2017-10-21 17:05:15

标签: android firebase firebase-realtime-database

我在Android应用中从Firebase恢复数据时遇到错误。

错误

here.

我的代码:

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    DatabaseReference ref = databaseReference.child(path);

    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            String value = dataSnapshot.getValue(String.class);

            ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
            clipboard.setText(value);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {


        }

"路径" - 孩子的名字。

和我的 Firebase Database

2 个答案:

答案 0 :(得分:0)

您的代码会读取数据根目录中的所有数据。

因此,dataSnapshot传递给onDataChange的内容是:

{
  "uzmtn": "data"
}

然后在其上调用dataSnapshot.getValue(String.class),这是不可能的:快照中的值不是字符串。

有两个简单的选项可以解决它:

  1. 读取树中较低的数据
  2. 从现有快照中获取正确的孩子
  3. 我将从第二个开始,因为它最接近你的代码。

    从现有快照中获取正确的子项

    由于您已经在dataSnapshot中获取了整个JSON,因此您可以使用DataSnapshot class的方法来查找所需的值。

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference();
    
    DatabaseReference ref = databaseReference.child(path);
    
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.child("uzmtn").getValue(String.class);
    
            ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
            clipboard.setText(value);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    

    虽然这有效,但您阅读的数据略多于所需数据。这里并不算太糟糕,但作为一般情况:最好只读取您需要的精确数据。

    为此,我们可以......

    读取树中较低的数据

    您可以直接将侦听器附加到uzmtn节点,而不是侦听数据库的根目录:

    DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference("uzmtn");
    
    DatabaseReference ref = databaseReference.child(path);
    
    ref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            String value = dataSnapshot.getValue(String.class);
    
            ClipboardManager clipboard = (ClipboardManager) getApplicationContext().getSystemService(CLIPBOARD_SERVICE);
            clipboard.setText(value);
        }
    
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException(); // don't ignore errors
        }
    

    如果你这样做,dataSnapshot将包含你正在寻找的字符串:

    "data"
    

    在快照中,对dataSnapshot.getValue(String.class)的调用将起作用。

答案 1 :(得分:0)

您正在返回哈希图类型,因为未指定要返回的孩子。想象一下您的数据结构就像firebase数据库中的一棵树,每个节点都有自己的值。 您想要返回的是树中的子节点,但是,您返回的是节点本身,这将返回节点本身和整个子节点。

简单的解决方案是

dataSnapshot.child('emtz').getValue() .....