Tengo un pojo que mapea un documento de Firestore. Ese documento contiene referencias a otros documentos de otra colección.
class Game(var local: String? = null, var visitor: String? = null, var events: MutableList<DocumentReference> = mutableListOf(), var date: Date? = null): SerializableEl problema es que DocumentReference no es serializable. He leído que puedo guardar la ruta como String y luego crear el objeto yo mismo (FirebaseFirestore.getInstance().document(path)), pero luego en Firestore ya no hay un campo de tipo Referencia.
Entonces mi pregunta, ¿Es este el buen enfoque? Además, ¿importa que el campo sea una cadena en lugar de una referencia?
Saludos, Diego
Entonces mi pregunta es, ¿es este el buen enfoque?
Sí, lo es. La parte más importante de una DocumenetReference es la ruta de la cadena. Si serializa eso, puede reconstituir un objeto DocumentReference, muy fácil.
Como conclusión, si necesita serializar un objeto DocumentReference , use el método getPath() de DocumentReference para obtener una cadena literal que represente la ubicación del documento en la base de datos. Para deserializar esa cadena de ruta nuevamente en un objeto DocumentReference , simplemente use FirebaseFirestore.getInstance().document(path) .
Editar:
Esto implica que el campo en la base de datos ahora es una Cadena en lugar de una Referencia.
Así es.
¿Importa? Supongo que ser un Reference debe tener algún tipo de ventaja.
Sí, dado que ahora la propiedad es de tipo String, ya no puede aprovechar lo que proporciona la clase DocumentReference . Pero esta es la solución que puede ayudarlo a lograr lo que desea. La clase de cadena es serializable mientras que la de DocumentReference no lo es.
Tengo una respuesta elaborada aquí . el codigo es
private ArrayList<String> docRefToString(ArrayList<DocumentReference> products) { ArrayList<String> newProducts = new ArrayList<String>(); for (DocumentReference product : products) { newProducts.add(product.getPath()); } return newProducts; } private ArrayList<DocumentReference> docStringToDoc(ArrayList<String> products) { ArrayList<DocumentReference> newProducts = new ArrayList<DocumentReference>(); for (String product : products) { newProducts.add(FirebaseFirestore.getInstance().document(product)); } return newProducts; }Y en la implementación Parcel..
private Request(Parcel in) { ... ArrayList<String> strProducts = in.createStringArrayList(); this.products = docStringToDoc(strProducts); ... } @Override public void writeToParcel(Parcel dest, int flags) { ... dest.writeStringList(docRefToString(this.products)); ... }