从Firebase数据库检索数据返回空值

时间:2016-11-20 10:32:51

标签: android firebase firebase-realtime-database

我在Firebase中创建了一个数据库,其规则如下:

{
  "rules": {
    ".read": true,
    ".write": true
  }
}

我的数据库以JSON数据的形式显示,如下所示:

fieldglass-aeca7
 0 
   age: 23
   name:"shikher"
 1
  age:24
  name:"samarth"

fieldglass-aeca7
  -KWm_3CF1pSVtuy9nhFF
      age:12
      name:"shikhermishra"
  -KWmaVs4frXpS_1lVhcj
      age:13
      name: "Shiker"

现在我编写了一个代码来读取数据库中的数据。还有一个类User,它有2个数据成员年龄,名称。

用户类如下:

import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;




public class User {

public int age;
 public String name;

 public User(){
 }
 public User(int age,String name)
 {
  this.name=name;
  this.age=age;
 }

 public void setAge(int age) {
  this.age = age;
 }

 public void setName(String name) {
  this.name = name;
 }


 public int getAge() {
  return age;
 }

 public String getName() {
  return name;
 }
}

我的数据库提取代码如下:

FirebaseDatabase database=FirebaseDatabase.getInstance();
        DatabaseReference reference=database.getReference("fieldglass-aeca7");

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                User user=dataSnapshot.getValue(User.class);
                Log.d("user info---@@*******",String.valueOf(user.getAge()));



                assert tv != null;
                assert tv1 != null;
                tv.setText(String.valueOf(user.age));
                tv1.setText(user.name);


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

                Log.d("The read failed",databaseError.getDetails());
            }
        });

我正在尝试获取年龄和姓名,并将其显示在我拥有的TextView上。

但我得到的输出是

user.age=0 and user.name=null.

我想获取内部存在的所有数据:

fieldglass-aeca7
......

   fieldglass-aeca7

这个关键值。

我希望显示上述路径中的所有数据。我怎么能得到它?

1 个答案:

答案 0 :(得分:2)

我认为,收到的DataSnapshot就像一个数组,你必须首先为它的孩子循环。

正确的情景可能是这样的:

if (dataSnapshot.hasChildren())
{
     for (DataSnapshot child : dataSnapshot.getChildren)
     {
          User user = child.getValue(User.class);

          // your actions here: 
          assert tv != null;
          assert tv1 != null;
          tv.setText(String.valueOf(user.age));
          tv1.setText(user.name);

      }
 }

注意:dataSnapShot.getChildren只返回Iterable<DataSnapshot>,因此没有更改只是循环。