我有一个Firestore数据库,如下所示:
我想要访问每个不同的症状数据,即"Anxiety_data“及其子文件(由时间戳组成),然后是一个字典,并使用FirebaseUI
FirebaseRecyclerViewAdapter
将它们放入RecyclerView
中
我有一个模型类:
public class EntryDataModel {
private String timestamp, symptom, severity, comment;
public EntryDataModel() {}
public EntryDataModel(String timestamp, String symptom, String severity, String comment) {
this.timestamp = timestamp;
this.symptom = symptom;
this.severity = severity;
this.comment = comment;
}
public String getTimestamp() {return timestamp;}
public String getSymptom() {return symptom;}
public String getSeverity() {return severity;}
public String getComment() {return comment;}
}
这是我的Query
Query query = db.collection("users").document(user_id).collection("symptom_data");
这是Firebase RecyclerView Adapter
void fireStoreRecyclerAdapterSetup() {
FirestoreRecyclerOptions<EntryDataModel> options = new FirestoreRecyclerOptions.Builder<EntryDataModel>()
.setQuery(query, EntryDataModel.class)
.build();
FirestoreRecyclerAdapter adapter = new FirestoreRecyclerAdapter<EntryDataModel, EntryDataHolder>(options) {
@Override
public void onBindViewHolder(EntryDataHolder holder, int position, EntryDataModel model) {
// Bind the Chat object to the ChatHolder
// ...
System.out.println("Query: " + query.toString());
}
@Override
public EntryDataHolder onCreateViewHolder(ViewGroup group, int i) {
// Create a new instance of the ViewHolder, in this case we are using a custom
// layout called R.layout.message for each item
View view = LayoutInflater.from(group.getContext())
.inflate(R.layout.entry_data_recyclerview_item, group, false);
return new EntryDataHolder(view);
}
};
recyclerView.setAdapter(adapter);
adapter.startListening();
}
}
我不确定应该如何设置,以便从每个症状数据字段中获取所有时间戳数组,并将它们放在一个列表中,以便用于recyclerView
。
也许我不能使用FirebaseUI回收器适配器,或者我需要首先迭代每个不同的症状字段,然后构建+附加一个列表?希望我很清楚我想做什么谢谢。
编辑:我已经在iOS上做了,这是我想要的结果:
编辑:我添加了这个,获取了每个文档的名称,然后在for循环中添加了这个,现在我正在尝试获取数组的值,并将其添加到EntryDataModel
列表中,然后我可以使用自己的适配器:
编辑:这行得通,我可以从每个文档中获取所需的数据。现在我只需要能够遍历字段和时间戳,并使用我的模型创建一个列表。D/example: DocumentSnapshot data: {1558879769={severity=Mild, symptom=Anxiety, comment=Mild anxiety at work., timestamp=1558879769}, 1558879745={severity=Mild, symptom=Anxiety, comment=Feeling relaxed watching TV., timestamp=1558879745}, 1558879710={severity=Moderate, symptom=Anxiety, comment=Walking the cat., timestamp=1558879710}, 1558879827={severity=Moderate, symptom=Anxiety, comment=Taking the cat for a walk., timestamp=1558879827}, 1558888729={severity=Mild, symptom=Anxiety, comment=The cat is fed up with walking., timestamp=1558888729}}
现在我只需要获取每个时间戳数组,并将它们添加到一个单独的列表中,然后我就可以对每个文档执行此操作,并获得所有时间戳数组的完整列表。
void getSymptomData() {
final CollectionReference colRef = db.collection("users").document(user_id).collection("symptom_data");
colRef.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<String> list = new ArrayList<>();
for (QueryDocumentSnapshot document : task.getResult()) {
list.add(document.getId());
DocumentReference docRef = colRef.document(document.getId());
docRef.get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
@Override
public void onComplete(@NonNull Task<DocumentSnapshot> task) {
if (task.isSuccessful()) {
DocumentSnapshot document = task.getResult();
if (document.exists()) {
Log.d("Iteration", "DocumentSnapshot data: " + document.getData());
} else {
Log.d("NoDoc", "No such document");
}
} else {
Log.d("Failed", "get failed with ", task.getException());
}
}
});
}
Log.d("listylist", list.toString());
} else {
Log.d("tag", "Error getting documents: ", task.getException());
}
}
});
}
发布于 2019-05-26 22:25:25
Firebase SDK可以执行从Firestore文档到Java对象的自动映射,这要求文档中的每个字段名都与Java类中的属性名匹配。它没有处理动态字段的机制,比如示例中的时间戳。
因此,您必须自己进行转换。为此,您可以使用public T get (FieldPath fieldPath, Class valueType)
or public T get (String field, Class valueType)
method,它允许您从指定的特定字段中获取对象。因此,您必须遍历时间戳字段,但之后Firebase SDK可以将severity
、symptom
和timestamp
属性映射到对象。
https://stackoverflow.com/questions/56314221
复制相似问题