Вы получаете следующую ошибку:
Невозможно преобразовать объект типа com.google.firebase.firestore.DocumentReference в тип org.my.app.model.Himno (находится в поле'himno')
Поскольку вы пытаетесь преобразовать объект DocumentReference
в объект Himno
.В Java нет способа достичь этого, так как между ними нет отношений наследования.
Документ, который вы пытаетесь получить из следующего местоположения:
db.collection("liturgia").document("breviario").collection("oficio").document("20190204");
Типа Oficio
, поэтому следующая строка кода:
Oficio oficio = documentSnapshot.toObject(Oficio.class);
Будет отлично работать.Проблема в том, что вы пытаетесь получить объект Himno
, который вложен в ваш класс Oficio
, например:
Himno himno=oficio.getHimno();
И это не будет работать так, как вы делаете, так как ваш himno
свойство внутри документа содержит значение типа DocumentReference
и , а не типа Himno
.
См.свойство himno
имеет ссылку.Если вы хотите получить ссылку на этот документ, просто используйте:
DocumentReference documentReference = documentSnapshot.getDocumentReference("himno");
Если вы хотите использовать:
Himno himno=oficio.getHimno();
Затем измените свойство himno
на тип Himno
а не DocumentReference
.
Другая проблема в вашем коде, о которой @Anees также указал в своем ответе, заключается в том, что метод getTexto()
должен возвращать String
, а не Spanned
объект, потому что этокаким образом хранится в базе данных.
Смотрите, свойство texto
содержит String, а не Spanned
.Но это не причина возникновения вашей ошибки.
Обратите также внимание, что следующее предложение:
Пользовательские классы в Firestore должны содержат
Неверно!Нет необходимости ни в общедоступном конструкторе без аргументов, ни в общедоступных методах получения.
Так что ваш класс может выглядеть просто так:
public class Oficio {
public Invitatorio invitatorio;
public Himno himno;
public Salmodia salmodia;
public String oracion;
public String responsorio;
public OficioLecturas oficioLecturas;
}
Без каких-либо конструкторов, сеттеров или геттеровсовсем.Больше информации здесь .
Редактировать:
Согласно вашему комментарию:
Я изменил тип getTexto () с Spanned на String, но он не работает.
Изменение только типа возврата вашего getTexto()
метода с Spanned
на String
не поможет вамрешить основную ошибку.
Я не понимаю, как я могу изменить свойство himno, чтобы иметь тип Himno, а не DocumentReference.
Вы не поделилисьТо, как вы добавляете данные в базу данных, но на самом деле все очень просто.Сначала удалите это свойство himno
из этих документов.Затем, когда вы добавляете новый документ, вместо добавления DocumentReference
, добавьте объект типа Himno
, поскольку я также вижу, что вы объявили в своем классе Oficio
.Это также означает, что когда вы будете использовать следующую строку кода:
Himno himno=oficio.getHimno();
Будет возвращен объект типа Himno
, а не DocumentReference
.Это потому, что он хранится в соответствии с его типом данных.
В RealTimeDatabase возможно взять только один объект (пример Oficio) и из этого объекта я могу получить ссылки на другой вложенный объект (Himno parпример).
Это также можно сделать в Cloud Firestore, но вам нужно получить данные в соответствии с типом данных вашего свойства, которое существует в базе данных.Если ваше свойство имеет тип DocumentReference
, вы не можете получить его как тип Himno
, если не добавите его следующим образом.
См. Раздел «Пользовательские объекты» в документации * 1121.*
Да, понятно.Вот почему я сказал вам, чтобы получить данные в соответствии с типом данных, которые они хранятся.Так что если у вас есть данные, хранящиеся как DocumentReference
, получите их в соответствии с нимиЕсли вы хотите получить его как Himno
, сначала сохраните его как Himno
, а затем получите соответственно.
Edit2:
Вы говорите мне, что можете создать поле типа Химно в Firestore?
Да, вы можете сделать это.Как вы добавили эту ссылку в базу данных?Таким же образом вы добавили эту ссылку, добавив объект Himno
.
Я не понимаю, как мне этого добиться.
Когда вы добавляете данные вбазу данных, создав объект типа Oficio
, правильно установите объект Himno
.Попробуйте это:
Oficio oficio = new Oficio();
Himno himno = new Himno();
himno.setTexto("Your Text");
oficio.setHimno(himno);
docRef.set(oficio);
Я не совсем понимаю, что с этим связано?
Да.Чтобы иметь возможность управлять базой данных Cloud Firestore, вы должны иметь, по крайней мере, базовые знания о:
- Как создавать объекты в Java
- Как установить свойства объекта
- КакДобавить данные в Cloud Firestore
- Что такое коллекции / документы
- Разрешенный тип данных в Firestore