Проблема с преобразованием documentSnapshot в пользовательский объект

#java #android #firebase #google-cloud-firestore

#java #Android #firebase #google-облако-firestore

Вопрос:

Я пытался загрузить пользовательский объект из Firestore после его загрузки, в документе есть информация, но он не преобразует ее в пользовательский объект, и получение отдельных значений из документа также не работает. Я получаю каждое поле моего пользовательского объекта как null рядом с одним целым числом, которое получает 0, хотя оно не должно быть равно 0. Код для загрузки:

  DocumentReference docRef = FirebaseFirestore.getInstance().collection(email).document(flightName);
    docRef.get().addOnSuccessListener(new OnSuccessListener<DocumentSnapshot>() {
        @Override
        public void onSuccess(DocumentSnapshot documentSnapshot) {
            Flight flight = documentSnapshot.toObject(Flight.class);
            flightArrayList.add(flight);
            recyclerView.setAdapter(myadapter);
        }
    });
  

код для моего класса Flight:

 private String name, email;
private int countPictures;
private String dateStart, dateEnd;
private ArrayList<String> links;

 public Flight() {

}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getEmail() {
    return email;
}

public void setEmail(String email) {
    this.email = email;
}

public int getCountPictures() {
    return countPictures;
}

public void setCountPictures(int countPictures) {
    this.countPictures = countPictures;
}

public String getDateStart() {
    return dateStart;
}

public void setDateStart(String dateStart) {
    this.dateStart = dateStart;
}

public String getDateEnd() {
    return dateEnd;
}

public void setDateEnd(String dateEnd) {
    this.dateEnd = dateEnd;
}

public ArrayList<String> getLinks() {
    return links;
}

public void setLinks(ArrayList<String> links) {
    this.links = links;
}
  

Загрузить код:

     DocumentReference docRef = FirebaseFirestore.getInstance().collection(flight.getEmail()).document(flight.getName());
    Map<String, Object> flightObject = new HashMap<>();
    flightObject.put("FLIGHT", flight);
    docRef.set(flightObject)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(SaveAct.this, "saved", Toast.LENGTH_LONG).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(SaveAct.this, "error", Toast.LENGTH_LONG).show();

                }
            });
  

Экран Firestore:
введите описание изображения здесь

содержимое документа из отладчика:

 Document{key=yuvala2001@gmail.com/night test, data=ArraySortedMap{(FLIGHT=>ArraySortedMap{(countPictures=>2), (dateEnd=>2019-03-12 19:30), (dateStart=>2019-03-12 19:30), (email=>yuvala2001@gmail.com), (links=>[https://firebasestorage.googleapis.com/v0/b/gsdemo-3f97f.appspot.com/o/yuvala2001@gmail.com/night test_0?alt=mediaamp;token=7242371e-a853-48d7-adab-05795493c352, https://firebasestorage.googleapis.com/v0/b/gsdemo-3f97f.appspot.com/o/yuvala2001@gmail.com/night test_1?alt=mediaamp;token=b249ea0a-55bb-46e0-b8b0-f8f1c065c613]), (name=>night test)};)};, version=SnapshotVersion(seconds=1552411921, nanos=640212000), documentState=SYNCED}
  

Редактировать:

Я исправил код, проблема заключалась в загрузке объекта внутри карты, согласно документам Firebase, это не позволит вам загрузить его правильно. Правильный код для загрузки:

 DocumentReference docRef = FirebaseFirestore.getInstance().collection(flight.getEmail()).document(flight.getName());
    docRef.set(flight)
            .addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Toast.makeText(SaveAct.this, "saved", Toast.LENGTH_LONG).show();
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    Toast.makeText(SaveAct.this, "error", Toast.LENGTH_LONG).show();

                }
            });
  

Комментарии:

1. Пожалуйста, покажите точное содержимое документа, который вы пытаетесь преобразовать, а также то, как вы ожидаете, что его поля будут отображены в объект Flight. Также, пожалуйста, покажите весь класс полета, не вырезайте получатели и установщики, поскольку их имена имеют значение.

2. @DougStevenson Я отредактировал свой вопрос с помощью методов получения, настройки и снимка экрана с экрана firestore. имена переменных совпадают с именами в пользовательском объекте и firestore

3. @DougStevenson Как я уже писал, все мои поля обнуляются рядом с графическими изображениями, которые принимают 0 в качестве значения, вместо этого предполагается, что там есть информация из firestore. И из того, что я заметил, в logcat не появилось ошибок по этому поводу

4. Существует ли запрошенный документ на самом деле? Проверьте метод exists для объекта snapshot. У нас нет гарантии, что вы запрашиваете именно то, что вы показали здесь.

5. @DougStevenson Я проверил, используя точку останова, я смог получить оба документа, но информация не могла быть преобразована из document в Flight object