En mi aplicación de Android tengo una clase de PDI con las siguientes propiedades y constructores:

/**
 * A POJO class for a POI (Point Of Interest)
 */
@Parcel
public class POI {
    String id;
    String name;
    int release;
    Double latitude;
    Double longitude;
    String description;
    String img_url;
    String collection;
    int collectionPosition;
    String stampText;
    boolean stampChecked; // Has the POI been checked to be stamped?
    Stamp stamp;

public POI(){}

public POI(String id){
    this.id = id;}

public POI(String id,
           String name,
           int release,
           Double latitude,
           Double longitude,
           String description,
           String img_url,
           String collection,
           int collectionPosition,
           String stampText) {
    this.id = id;
    this.name = name;
    this.release = release;
    this.latitude = latitude;
    this.longitude = longitude;
    this.description = description;
    this.img_url = img_url;
    this.collection = collection;
    this.collectionPosition = collectionPosition;
    this.stampText = stampText;
    this.stampChecked = false;
}

Cuando almaceno objetos de PDI en Firestore, surgen dos problemas.

  1. Firestore crea una propiedad de sello, aparentemente porque tengo una propiedad de sello en mi clase de PDI. Mi modelo de PDI tiene una propiedad de Sello porque la necesito solo para propósitos de mi código. No lo necesito almacenado en la base de datos. ¿Hay alguna forma, como una anotación, que pueda usar para decirle a Firestore qué campos puede ignorar?

  2. Firestore crea una propiedad llamada 'estampada', aunque NO tengo ninguna de esas propiedades en mi clase de PDI. La única razón por la que puedo adivinar que esto está sucediendo es porque tengo el siguiente método en mi clase:

    public boolean isStamped(){
         return (stamp instanceof Stamp);
    }
    

¿Hay alguna manera de decirle a Firebase que ignore ciertas propiedades o que fuerce a Firebase a usar un constructor específico, sin tener que deshacerse o cambiar el nombre de mis getters y setters ?

2
szaske 15 feb. 2018 a las 20:48

2 respuestas

La mejor respuesta

Puede utilizar la anotación Exclude en una campo o método para evitar que se serialice.

En la siguiente clase, la propiedad "bar" no aparecerá cuando se serialice, ya que el captador está anotado con @Exclude.

public class Foo {

    private String thing;
    private String bar;

    public Foo() {
    }

    @Exclude
    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

    public String getThing() {
        return thing;
    }

    public void setThing(String thing) {
        this.thing = thing;
    }
}
3
Doug Stevenson 15 feb. 2018 a las 19:08

Sí lo es. A diferencia de la base de datos de Firebase Realtime, donde los valores no existentes no se muestran en absoluto, en Cloud Firestore, si agrega un campo que es null, el resultado será yourField: null. Si quieres asegurarte de que nunca tendrás valores null cuando se trata de objetos o cadenas vacías "" cuando se trata de cadenas, cuando escribas un documento en Firestore, puedes usar un {{ X4}} y rellénelo solo con los campos que desee.

HashMap<String, Object> map = new HashMap<>();
if (stampChecked != null) {
    map.put("stampChecked", true);
}
//Same for the other properties.

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
rootRef.collection("yourCollection").document("yourDocument").set(map);

Si ya tiene dichos valores en su base de datos, puede usar estas líneas de código para eliminarlos:

Map<String, Object> map = new HashMap<>();
map.put("yourField", FieldValue.delete());
yourRef.update(map);
0
Alex Mamo 15 feb. 2018 a las 18:48