首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何处理我的数据模型类以将Firebase Firestore数据导入到recyclerView中?

如何处理我的数据模型类以将Firebase Firestore数据导入到recyclerView中?
EN

Stack Overflow用户
提问于 2019-05-26 22:05:20
回答 1查看 1.1K关注 0票数 0

我有一个Firestore数据库,如下所示:

我想要访问每个不同的症状数据,即"Anxiety_data“及其子文件(由时间戳组成),然后是一个字典,并使用FirebaseUI FirebaseRecyclerViewAdapter将它们放入RecyclerView

我有一个模型类:

代码语言:javascript
复制
  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

代码语言:javascript
复制
Query query = db.collection("users").document(user_id).collection("symptom_data");

这是Firebase RecyclerView Adapter

代码语言:javascript
复制
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}}现在我只需要获取每个时间戳数组,并将它们添加到一个单独的列表中,然后我就可以对每个文档执行此操作,并获得所有时间戳数组的完整列表。

代码语言:javascript
复制
  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());
             }
         }
     });

}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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可以将severitysymptomtimestamp属性映射到对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56314221

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档