使用getValue(classname)将检索到的数据转换为对象

时间:2017-03-19 23:15:26

标签: android firebase firebase-realtime-database

我在Firebase的数据库中有以下结构:

enter image description here

现在我有以下代码:

final String fDate = DAL_Utilities.ConvertDateToFirebaseDate(date);
URL url = new URL(DAL_Utilities.DatabaseURL + "users/" + user.getName()+ "/Stimmungsabfrage/" + fDate);
Firebase root = new Firebase(url.toString());
root.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
    Object obj = dataSnapshot.getChildren();


} 
@Override
public void onCancelled(FirebaseError firebaseError) {

}
});

但在执行dataSnapshot.getChildren()后,我有节点 20170316 。我有一个班级StimmungAbfrage

public class StimmungAbfrage {
    public String Date;
    public Integer Angespannt ;
    public Integer Mitteilsam;
    public Integer Muede;
    public Integer Selbstsicher;
    public Integer Tatkraeftig;
    public Integer Traurig;
    public Integer Wuetend;
    public Integer Zerstreut;
    }

V 的节点下的数据应转换为此类的对象。但我现在的价值是 20170316 。如何获取 V 的快照,以便我可以对其执行getValue(StimmungAbfrage.classname)

1 个答案:

答案 0 :(得分:1)

要检索数据节点并将其解析为Java类对象,可以使用getValue方法。

getValue(Class valueType)

提供:

  1. 该类有一个默认的空构造函数。
  2. 该类必须包含要分配的属性的公共getter。
  3. 例如,看看这个示例类定义;

        public class User {
    
              private String display_name;
              private String email;
    
              public User() {
                // Default constructor required for calls to DataSnapshot.getValue(User.class)
              }
    
              public User(String display_name, String email) {
                  this.display_name = display_name;
                  this.email = email;
              }
    
              public String getDisplay_name() {
                  return display_name;
              }
    
              public String getEmail() {
                  return email;
              }
    
          }
    

    因此,请确保您的 StimmungAbfrage 类符合Firebase指南。

    <强>更新

    我在这个答案中有两个解决方案;

    1. 如何使用当前数据库结构检索数据。
    2. 如何根据我推荐的不太复杂的数据库结构检索数据。
    3. 解决方案1 ​​

      您当前的结构包含以下数据:

      "20170316" : {
        "-KfNx5TBo4yQpfN07Ekh" : {
          "V":{
          "Angespannt" : 3,
          etc..
          }
        }
      }
      

      您将检索如下数据:

      String strKey = "";
      List<StimmungAbfrage> listOfObjects = new ArrayList<>();
      
      root.addListenerForSingleValueEvent(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
      
       //retrieve key -KfNx5TBo4yQpfN07Ekh
       for (DataSnapshot datachild : dataSnapshot.getChildren()) {
           strKey = datachild .getKey();
       }
      
        //use the key to access inner children and parse them to an object and add it to list
      
          dbRef.child(strKey).addListenerForSingleValueEvent(new ValueEventListener() {
              @Override
              public void onDataChange(DataSnapshot dataSnapshot) {
      
                for(DataSnapshot dataSnap : dataSnapshot.getChildren()){
      
                  StimmungAbfrage stimmungAbfrage = dataSnap.getValue(StimmungAbfrage.class);
                  listOfObjects.add(stimmungAbfrage);
      
                }
             }
         }
      
      .....  
      

      注意: dbRef应该指向与root引用相同的节点加上推送ID密钥,之后添加如下:

      dbRef.child(strKey) // strKey hold the pushID (-KfNx5TBo4yQpfN07Ekh)
      

      解决方案2

      使用我推荐的数据结构,如下所示:

      "20170316" : {
        "-KfNx5TBo4yQpfN07Ekh" : {
          "Angespannt" : 3,
          etc..
        }
      }  
      

      如果 -KfNx5TBo4yQpfN07Ekh 节点中没有更多嵌套子节点(因为您没有指定),我推荐这种方法。

      StimmungAbfrage stimmungAbfrage; //global scope
      
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
      
        stimmungAbfrage = dataSnapshot.getValue(StimmungAbfrage.class);
      
      }
      ...
      

      了解更多信息:Read and Write Data on Android

      HTH。