Как мне обработать мой класс модели данных, чтобы получить данные Firebase Firestore в recyclerView? - PullRequest
0 голосов
/ 26 мая 2019

У меня есть база данных Firestore, как это:

enter image description here

Я хочу получить доступ к каждой из данных различных симптомов, то есть "Anxiety_data" и ее дочерним элементам, которыесостоит из меток времени, а затем словаря и поместите их в RecyclerView, используя FirebaseUI FirebaseRecyclerViewAdapter

У меня есть этот класс модели:

  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 Recycler, или мне нужно сначала пройтись по каждому полю симптомов и создать + добавитьсписок?Надеюсь, у меня есть четкое представление о том, что я хотел бы сделать. Спасибо.

РЕДАКТИРОВАТЬ: Я сделал это на iOS, вот результат, который я хочу:

enter image description here

РЕДАКТИРОВАТЬ: я добавил это, получая имена каждого отдельного документа, а затем, когда у меня есть это в цикле for, я сейчас пытаюсь получить значения Array и добавить это к EntryDataModelсписок, тогда я могу использовать свой собственный адаптер:

РЕДАКТИРОВАТЬ: Это работает, я получаю необходимые данные, из каждого документа.Теперь мне просто нужно иметь возможность перебирать поля и временные метки и использовать мою модель для создания списка.Как я могу это сделать?Log.d("example", "DocumentSnapshot data: " + document.getData()); это печатает: 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());
             }
         }
     });

}

1 Ответ

0 голосов
/ 26 мая 2019

Автоматическое сопоставление, которое Firebase SDK может выполнять из документа Firestore к объекту Java, требует, чтобы каждое имя поля в документе соответствовало имени свойства в классе Java.У него нет механизма для работы с динамическими полями, такими как временные метки в вашем примере.

Так что вам придется делать свое собственное преобразование.Для этого вы можете использовать public T get (FieldPath fieldPath, Class<T> valueType) или public T get (String field, Class<T> valueType) метод , который позволяет вам получить объект из указанного вами поля.Таким образом, вам придется циклически проходить по полям отметок времени, но после этого Firebase SDK может сопоставить свойства severity, symptom и timestamp с объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...