我在Firebase的数据库中有以下结构:
现在我有以下代码:
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)
?
答案 0 :(得分:1)
要检索数据节点并将其解析为Java类对象,可以使用getValue方法。
getValue(Class valueType)
提供:
例如,看看这个示例类定义;
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
您当前的结构包含以下数据:
"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。