【问题标题】:Not able to retrieve data field from Firebase database无法从 Firebase 数据库中检索数据字段
【发布时间】:2017-06-06 21:07:37
【问题描述】:

在过去的 5 天里,我一直在尝试从我的 firebase 数据库中检索数据字段,但没有任何成功。这是我的数据库的样子:

获取数据的代码:

private void alterTextView(final String id) {
        if(id!=null) {
        mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                UserInformation userInformation = dataSnapshot.getValue(UserInformation.class);
                String name = (String) userInformation.getName();


                Log.d("Main Activity",name);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
        mWelcomeUserMessage.setText("Welcome, "+name); 

    }
}`

我不知道为什么名字是'null'(参考日志)。 谁能告诉我我做错了什么?

PS:我在我的 UserInformation.java 类中定义了一个空白的默认构造函数、getter 和 setter。

另外,mDatabase初始化如下: mDatabase = FirebaseDatabase.getInstance().getReference();

【问题讨论】:

  • 你能把你的dataSnapshot的.toString()放在这里吗?
  • 我不明白.. 我的数据快照没有 .toString()。我认为 getValue() 就足够了吗?
  • 它将打印一个带有键和值的 json。 Log.d(TAG, "收到的数据:" + dataSnapshot.toString());
  • 请编辑您的问题并将图片替换为实际代码和 JSON。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取后者。
  • toString() 方法完美运行

标签: android firebase firebase-realtime-database


【解决方案1】:

dataSnapshot.getValue(Class) 只会将值加载和设置到公共字段中。我看到你已经有了一个默认构造函数。

将 UserInformation 类中的名称字段设为公开。还要确保您调用 getValue 的快照是 UserInformation 类的有效 JSON 表示形式,并且具有完全相同的“名称”字段(它必须与类中的名称字段完全匹配)。

请注意: addValueEventListener添加监听器,当有数据时会调用。

请注意,在调用onDataChange 后数据可用。这就是为什么您应该在从DataSnapshot 获得所需数据后立即设置文本。像这样:

private void alterTextView(final String id) {
            if(id!=null) {
            mDatabase.child("Users").child(id).addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    UserInformation userInformation = dataSnapshot.getValue(UserInformation.class);
                    String name = (String) userInformation.getName();
                    Log.d("Main Activity",name);
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run(){
                            mWelcomeUserMessage.setText("Welcome, "+name); 
                        }
                    });
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

        }
    }

【讨论】:

  • 我做到了。现在,当我尝试使用 dataSnapshot.toString() 方法显示类时,没有问题。但是,当我尝试设置我的文本视图的文本时,它仍然是空白的。我使用常规的 getter 方法来获取名称。
  • @Yash 请提供一些代码。您可能在 onDataChange 方法中设置 TextView 的文本。你不能这样做,因为它是异步调用的。
  • 我在最近更新的问题中提供了代码。它仍然显示为空
  • @YashChowdhary,我认为有问题的代码是您的 UserInformation bean 类。
猜你喜欢
  • 2018-07-09
  • 1970-01-01
  • 2018-09-04
  • 2018-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-15
  • 2019-11-28
  • 1970-01-01
相关资源
最近更新 更多